MySQL关闭连接事务自动提交的问题

本文探讨了MySQL数据库在关闭连接时事务自动提交的情况。默认MySQL处于自动提交状态,但当关闭连接且自动提交设为false时,事务不会自动提交。关闭连接前需恢复自动提交为true,才能确保事务提交。实验显示,若关闭自动提交后修改数据并直接关闭连接,数据不会变更;而先恢复自动提交再关闭连接,数据变更则会被提交。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        今天自主实验时,发现数据库关闭连接时自动提交事务的说法在实验过程中并未实现,因此查阅大量资料有以下结果。       

        MySQL事务默认情况下是自动提交的,当我们需要回滚事务时就需要将事务自动提交关闭,可以通过如下命令设置:

set AutoCommit = 0;

        当事务完成后可以通过如下命令进行提交:

commit

        当关闭数据库连接时,事务也会自动提交,但是此时必须将自动提交恢复为true,证明如下:

  • 当数据库的自动提交为false时,更改表中数据,此时直接关闭数据库,查询表中数据不变。

        表中初始数据:

         更改数据库自动提交为false:

         修改表中数据:

         直接关闭连接:

         重新连接并查询该数据:

        此时,我们发现表中数据并没有改变,也就是说关闭连接时事务并没有自动提交。

  • 当数据库的自动提交为false时,更改表中数据,此时将数据库的自动提交改为true,再关闭数据库连接,查询表中数据变了。

         表中初始数据:

         更改数据库自动提交为false:

         修改表中数据:

        再更改数据库自动提交为true:

         关闭连接:

         查询表中数据:

         此时我们发现表中数据已经变更,即数据库自动提交了该事务。

        通过查阅资料,查找到如下代码:

                if (!skipLocalTeardown) {
                    if (!this.getAutoCommit() && issueRollback) {
                        try {
                            this.rollback();
                        } catch (SQLException var21) {
                            sqlEx = var21;
                        }
                    }

        skipLocalTeardown在close调用的时候默认是false,issueRollback在close调用的时候默认是true(这部分可以看一下评论区博主LoongKK的评论),我们可以看到当关闭了自动提交后,关闭连接时会执行rollback而并非自动提交。于是猜想关闭连接时自动提交事务是否需要在autoCommit为true的情况下。

总结:

        MySQL的数据库连接在关闭时想要自动提交事务,一定要在连接关闭前设置自动提交为true

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值