1. 程式人生 > >mybatis事務與回滾例子 commit、rollback、autoCommit

mybatis事務與回滾例子 commit、rollback、autoCommit

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
u2 =new User2(1,22222);//故意設定的一個錯誤的User類,mapper.xml匹配的是User類不是User2類,所有在新增u2會出現異常

        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()只能回滾當前的一個事務