执行以下导致异常“当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,没有开始事务,没有提交,绝对没有回滚。
2 回答
杨魅力
TA贡献1811条经验 获得超6个赞
基于对ScriptRunner的快速浏览(不是问题中的确切版本,但足够接近),我们可以看到以下代码
if (!autoCommit) {
conn.commit();
}
现在很好,我们只在自动提交没有打开时提交。但是,如果抛出异常,则执行 finally 子句并且不考虑自动提交:
} finally {
conn.rollback();
flush();
}
这将导致丢失原始异常详细信息。
由于如果设置了记录器,则异常会打印日志,因此我建议执行以下操作:
scriptRunner.setErrorLogWriter(somePrintWriter); // Some PrintWriter, maybe to a file
这样你就会发现原来的异常。这也绝对是一个错误,因此需要报告(似乎我没有 github 凭据,因此拥有这些凭据的人可能会提出问题(或者嘿,为什么不提交拉取请求))。
侃侃尔雅
TA贡献1801条经验 获得超16个赞
如果您将自动提交设置为关闭,那么您负责保存您在数据库上的工作,因此在每次成功任务后,您必须执行提交命令,要设置自动提交关闭使用,connection.setAutoCommit(false)
然后在您的工作完成后执行 connection.commit()
以保存对数据库的更改或任何错误的情况下执行回滚命令connection.rollback()
希望它帮助!
添加回答
举报
0/150
提交
取消