您的位置:首页 > 数据库

mybatis事务与回滚例子 commit、rollback、autoCommit

2017-07-03 08:36 369 查看
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()只能回滚当前的一个事务
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息