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