我有一些Java代码,使用JDBC连接到MySQL数据库,然后进行一些读操作,再进行单个更新,所有操作都使用同一个连接。如果出现异常,则调用
正在使用的连接在创建连接实例后立即调用了
由于某种原因,当出现异常并调用
通过调试,我确认了以下内容:
我的所有表都使用InnoDB存储引擎。通过SQL Workbench,在自动提交关闭的情况下,回滚和提交按预期工作。
我正在使用MySQL版本“5.0.91-community-nt”。MySQL jdbc驱动程序版本为5.1.19。我正在使用Java 5。
有人有关于为什么我的更新即使自动提交关闭、从未调用提交并且明确调用回滚也被提交的建议吗?
谢谢。
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。
有人有关于为什么我的更新即使自动提交关闭、从未调用提交并且明确调用回滚也被提交的建议吗?
谢谢。
DatabaseMetaData.dataDefinitionCausesTransactionCommit()
的原因之一)。 - Mark Rotteveel