jdbc的事务自动提交和手动提交,以及mybatis开启自动提交后是否会复用一个连接的验证
转自:https://blog.****.net/cdy1996/article/details/81088623
默认时自动提交,当我手动提交时会报错,不过数据还是会插入到数据库中,因为执行完executeupdate后数据库会自动commit
开启手动提交
手动提交则需要手动调用commit才能提交事务
mybatis未开启自动提交事务
手动提交两次,当然数据库是提交一条才能看到一条,另外可以看到connect是使用的同一个
从源码中可以看到每次执行insert最后调用以下的方法
从prepareStatement可以看到
看到最后可以得到,即如果有的话就会用原来的连接,另外看过源码的同学应该知道,sqlsession创建出来时transaction就会被创建,而connect是由transaction管理的,所以只要用同一个sqlsession,那么connection使用的也是同一个
最后验证当mybatis使用自动提交事务时
可以看到即使使用自动提交事务,connection也是同一个,并会因为自动提交而重新获取connection
最后可以看到,mybatis防止在开启自动提交事务时手动调用commit方法做了判断,防止手动提交会抛出异常
总结
为了提高数据库执行的性能,我们不需要执行一条sql就去创建或者获取一个connection,而是可以重复使用,就像最开始jdbc那里一样,一个connection可以开启多个statement来执行多次,事务也可以分开提交也可以一次提交,且事务的提交不会关闭connection。