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

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

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

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

从prepareStatement可以看到

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

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

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

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

本文探讨了JDBC和MyBatis中事务管理的不同方式,包括自动提交与手动提交的区别,以及如何通过复用连接提高数据库操作性能。

4486

被折叠的 条评论
为什么被折叠?



