mybatis事務與回滾例子 commit、rollback、autoCommit
阿新 • • 發佈:2019-02-12
1.在JDBC中,設定一次將當前所有操作為一次事務的方式是: conn.setAutoCommit( false );
修改資料庫遵從try-cath-finaly:
try {
sqlsession.commit();
} catch (Exception e) {
sqlsession.rollback();
}finally {
sqlsession.close();
}
2.在mybatis中,設定setAutoCommit( false ):
mybatis官方AIp,
SqlSession openSession()
SqlSession openSession(boolean autoCommit) ;
預設無參的openSession(),即AutoCommit( false ):
如果要設定為自動事務則 openSession(true) ;
3.例項
public class MainTC {
/*使用sqlSession對資料庫做修改的操作,都必須在最後使用commit()方法提交,否則處理新增,其他操作都無效。
* */
public static void main(String[] args) throws IOException {
Reader reader= Resources.getResourceAsReader(“config.xml”);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlsession=sqlSessionFactory.openSession(false);//預設為false為一次事物
try {
User u1 =new User(1,”aaaa”,11);
User2
sqlsession.insert("resources.userMapper.addUser",u1); sqlsession.insert("resources.userMapper.addUser",u2); sqlsession.commit(); System.out.println("OK"); } catch (Exception e) { System.out.println("出錯------------"); e.printStackTrace(); sqlsession.rollback(); }finally { sqlsession.close(); } }
}
測試結果:
當openSession(false)時候,u1沒有插入資料庫
當openSession(true)時候,u1被插入資料庫
結論:1.openSession(false)時,當前所有的操作都為一個事務,當執行到 sqlsession.insert(“resources.userMapper.addUser”,u2);這句發生異常的時候,會執行 sqlsession.rollback();之前所有對資料庫的操作全部取消。
2.openSession(true)時,自動事務,後面對資料庫的操作發生異常,不影響前面對資料庫的操作,因為rollback()只能回滾當前的一個事務