我有一些 Java 代码使用 JDBC 连接到 MySQL 数据库,然后代码执行一些读取操作,然后进行一次更新,所有这些都使用相同的连接。如果有异常,则connection.rollback()
调用;如果没有异常,connection.commit()
则调用。在这个阶段,每次我运行测试时都会新创建连接(即它不是来自池)。我的代码只创建一个连接,并在整个测试过程中使用。
正在使用connection.setAutoCommit(false)
的连接在连接实例创建后立即调用。
由于某种原因,当出现异常并被connection.rollback()
调用时,事实证明我的更新已提交而不是回滚。
通过调试,我确认了以下内容,
调用后
connection.setAutoCommit(false)
,按预期connection.getAutoCommit()
返回 的值。false
此外,"Select @@session.autocommit"
返回值0
,表示自动提交已按预期关闭。在调用 之前
connection.rollback()
,同样的检查显示自动提交已关闭,正如预期的那样。connection.commit()
绝对没有被调用,并且connection.rollback()
肯定被调用。
我也尝试过显式运行该语句"rollback;"
,但它并没有解决我的问题。我还尝试"Set AUTOCOMMIT = 0;"
在创建连接后显式运行该语句。
我所有的表都使用 InnoDB 的存储引擎。通过 SQL Workbench,自动提交关闭,回滚和提交按预期工作。
我正在使用 MySQL 版本“5.0.91-community-nt”。MySQL jdbc 驱动版本为 5.1.19。我正在使用 Java 5。
有没有人对为什么我的更新被提交有任何建议,即使自动提交关闭,提交从未被调用,并且回滚被明确调用?
干杯。