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()只能回滚当前的一个事务