jdbc的事务自动提交和手动提交,以及mybatis开启自动提交后是否会复用一个连接的验证

转自:https://blog.****.net/cdy1996/article/details/81088623

jdbc的sql执行默认是自动提交事务

默认时自动提交,当我手动提交时会报错,不过数据还是会插入到数据库中,因为执行完executeupdate后数据库会自动commit

jdbc的事务自动提交和手动提交,以及mybatis开启自动提交后是否会复用一个连接的验证

 

开启手动提交

手动提交则需要手动调用commit才能提交事务

jdbc的事务自动提交和手动提交,以及mybatis开启自动提交后是否会复用一个连接的验证

 

 

mybatis未开启自动提交事务

手动提交两次,当然数据库是提交一条才能看到一条,另外可以看到connect是使用的同一个

jdbc的事务自动提交和手动提交,以及mybatis开启自动提交后是否会复用一个连接的验证

 

从源码中可以看到每次执行insert最后调用以下的方法

jdbc的事务自动提交和手动提交,以及mybatis开启自动提交后是否会复用一个连接的验证

 

从prepareStatement可以看到

jdbc的事务自动提交和手动提交,以及mybatis开启自动提交后是否会复用一个连接的验证

看到最后可以得到,即如果有的话就会用原来的连接,另外看过源码的同学应该知道,sqlsession创建出来时transaction就会被创建,而connect是由transaction管理的,所以只要用同一个sqlsession,那么connection使用的也是同一个

jdbc的事务自动提交和手动提交,以及mybatis开启自动提交后是否会复用一个连接的验证

 

最后验证当mybatis使用自动提交事务时

可以看到即使使用自动提交事务,connection也是同一个,并会因为自动提交而重新获取connection

jdbc的事务自动提交和手动提交,以及mybatis开启自动提交后是否会复用一个连接的验证

 

最后可以看到,mybatis防止在开启自动提交事务时手动调用commit方法做了判断,防止手动提交会抛出异常

jdbc的事务自动提交和手动提交,以及mybatis开启自动提交后是否会复用一个连接的验证

 

总结

为了提高数据库执行的性能,我们不需要执行一条sql就去创建或者获取一个connection,而是可以重复使用,就像最开始jdbc那里一样,一个connection可以开启多个statement来执行多次,事务也可以分开提交也可以一次提交,且事务的提交不会关闭connection。