当我没有执行回滚时,为什么会收到“当 AutoCommit 模式设置为“true”

执行以下导致异常“当AutoCommit模式设置为“true”时无法调用回滚操作。


java.sql.Connection connection = DriverManager.getConnection(connectionString);

com.ibatis.common.jdbc.ScriptRunner scriptRunner = new ScriptRunner(connection, true, true);

java.io.StringReader reader = new StringReader("PRINT 1;");

scriptRunner.runScript(reader);

// Cannot invoke a rollback operation when the AutoCommit mode is set to "true".

我的代码中没有引用回滚,而且我找不到任何选项来禁止它被强加给我。我查看了standalone.xml 并尝试设置jta=false。我在 sqlMapConfig\transactionManager 上找到并设置了 commitRequired=false,这是真的,但这并没有什么区别。


如果答案就在那里,我找不到它。我发现有人说“当然你不能回滚”,结果是禁用自动提交。我不是要求回滚,那么它来自哪里?根据https://www.programcreek.com/java-api-examples/index.php?api=com.ibatis.common.jdbc.ScriptRunner示例 3,我正在做的应该有效。


我想在自动提交模式(默认的 MS SQL Server 模式)下执行脚本,而不涉及或强制我执行任何事务,除了围绕 sql 脚本中每个单独语句的自动提交事务。我不希望 IMPLICIT_TRANSACTIONS ON,没有开始事务,没有提交,绝对没有回滚。


慕仙森
浏览 410回答 2
2回答

杨魅力

基于对ScriptRunner的快速浏览(不是问题中的确切版本,但足够接近),我们可以看到以下代码if (!autoCommit) {    conn.commit();}现在很好,我们只在自动提交没有打开时提交。但是,如果抛出异常,则执行 finally 子句并且不考虑自动提交:} finally {  conn.rollback();  flush();}这将导致丢失原始异常详细信息。由于如果设置了记录器,则异常会打印日志,因此我建议执行以下操作:scriptRunner.setErrorLogWriter(somePrintWriter); // Some PrintWriter, maybe to a file这样你就会发现原来的异常。这也绝对是一个错误,因此需要报告(似乎我没有 github 凭据,因此拥有这些凭据的人可能会提出问题(或者嘿,为什么不提交拉取请求))。

侃侃尔雅

如果您将自动提交设置为关闭,那么您负责保存您在数据库上的工作,因此在每次成功任务后,您必须执行提交命令,要设置自动提交关闭使用,connection.setAutoCommit(false) 然后在您的工作完成后执行 connection.commit()以保存对数据库的更改或任何错误的情况下执行回滚命令connection.rollback() 希望它帮助!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java