首页 > 解决方案 > 如何设置自动提交关闭,有助于在 JDBC 中启动事务?

问题描述

许多文章和文档说,通过关闭 Auto Commit,您可以在 JDBC 中启动事务。这个话题也问了同样的问题,但它没有回答这个问题,只是说:

更改自动提交模式会触发当前事务的提交(如果一个处于活动状态)。

好的。但接下来呢?

为了找到答案,我搜索并找到了这个

  • 自动提交事务:

每个单独的语句都是一个事务。

  • 显式交易:

每个事务都以 BEGIN TRANSACTION 语句显式启动,并以 COMMIT 或 ROLLBACK 语句显式结束。

  • 隐式交易:

前一个事务完成时会隐式启动新事务,但每个事务都使用 COMMIT 或 ROLLBACK 语句显式完成。

然后我发现了这个

提交交易

禁用自动提交模式后,在显式调用 commit 方法之前不会提交任何 SQL 语句。在上一次调用该方法之后执行的所有语句commit都包含在当前事务中,并作为一个单元一起提交。

因此我得出结论,在禁用自动提交模式后,我们处于隐式模式,我们也知道为了禁用自动提交,已经运行了一个 COMMIT 语句,因此在关闭自动提交后,我们开始了一个新的交易。

我们能根据这些案例得出这样的结论吗?这是一个正确的结论吗?

标签: javasqlsql-serverdatabasejdbc

解决方案


你不能。在 JDBC 中,自动提交仅控制事务何时结束。驱动程序应在需要时启动事务。特别是JDBC 4.3 规范在第10.1 节事务边界和自动提交中说:

何时开始新事务是由 JDBC 驱动程序或底层数据源隐式做出的决定。尽管某些数据源实现了显式的“开始事务”语句,但没有 JDBC API 可以这样做。通常,当当前 SQL 语句需要一个新事务并且没有事务已经到位时,会启动一个新事务。SQL:2003 还指定了给定的 SQL 语句是否需要事务。

Connection属性auto-commit指定何时结束事务。启用自动提交会在每个单独的 SQL 语句完成后立即提交事务。一条语句被认为是“完整”的点取决于 SQL 语句的类型以及应用程序在执行它后的行为:

  • 对于数据操作语言 (DML) 语句,例如 Insert、Update、Delete 和 DDL 语句,语句在执行完毕后即告完成。
  • 对于Select语句,当关联的结果集关闭时,语句就完成了。
  • 对于CallableStatement返回多个结果的对象或语句,当所有关联的结果集都已关闭并且已检索所有更新计数和输出参数时,该语句就完成了。

换句话说,当您调用时,connection.setAutoCommit(false)不会启动任何事务。只有在执行了一条语句(或其他需要事务的操作)时,如果没有活动事务,才会启动一个事务。


推荐阅读