为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕仙森 2021-08-04 16:52:04
执行以下导致异常“当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 凭据,因此拥有这些凭据的人可能会提出问题(或者嘿,为什么不提交拉取请求))。


查看完整回答
反对 回复 2021-08-04
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

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

查看完整回答
反对 回复 2021-08-04
  • 2 回答
  • 0 关注
  • 404 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信