一、JDBC事务铺垫
在JDBC事务操作中,conn.commit()和conn.setAutocommit(true)拥有相同的数据库操作效果,都会提交事务持久化对数据库的更改,这一点随便写个JDBC基本操作的demo就能够得到验证。
二、mybatis DQL
查看mybatis openSession的源码,除非传入boolean autoCommit=true,否则默认都是false。
因此mybatis的事务机制,无论是查询还是增删改,默认都会执行conn.setAutocommit(false),这句话会导致数据库关闭自动提交和开启事务(基本的JDBC demo已验证);在SqlSession关闭的时候会conn.setAutocommit(true),这里会提交事务。在使用基本的mybatis query的时候,最后是需要关闭SqlSession,如果忘记了这一步,在连接池机制下,会造成事务泄露,也就是说conn没有关闭,但是conn的事务一直没有提交。