【问题标题】:How setting Auto Commit off, helps to start a transaction in JDBC?如何设置自动提交关闭,有助于在 JDBC 中启动事务?
【发布时间】:2020-05-26 09:55:21
【问题描述】:

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

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

好的。但接下来呢?

为了寻找答案,我搜索并找到了this

  • 自动提交事务:

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

  • 显式交易:

每个事务都明确地以 BEGIN TRANSACTION 语句并以 COMMIT 或显式结束 ROLLBACK 语句。

  • 隐式交易:

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

然后我找到了this

提交交易

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

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

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

【问题讨论】:

    标签: java sql sql-server database jdbc


    【解决方案1】:

    不,你不能。在 JDBC 中,自动提交仅控制事务何时结束。驱动程序应在需要时启动事务。具体来说,JDBC 4.3 specification10.1 事务边界和自动提交节中说:

    何时开始新事务是由以下隐含的决定 JDBC 驱动程序或底层数据源。虽然有些 数据源实现显式的“开始事务”语句, 没有 JDBC API 可以这样做。通常,开始一个新事务 当当前 SQL 语句需要一个而没有 交易已经到位。是否给定的 SQL 语句 SQL:2003 也指定了需要事务。

    Connection 属性 auto-commit 指定何时结束 交易。启用自动提交后会导致事务提交 一旦该语句完成,每个单独的 SQL 语句。 一个陈述被认为是“完整”的点取决于 关于 SQL 语句的类型以及应用程序的功能 执行后:

    • 对于数据操作语言 (DML) 语句,例如 Insert、Update、Delete 和 DDL 语句,语句会尽快完成 因为它已完成执行。
    • 对于Select 语句,当关联的结果集关闭时,语句就完成了。
    • 对于 CallableStatement 对象或返回多个结果的语句,当所有关联的 结果集已关闭,所有更新计数和输出 已检索参数。

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

    【讨论】:

      猜你喜欢
      • 2012-03-27
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      • 2014-10-01
      • 1970-01-01
      • 2016-09-07
      • 2014-04-06
      • 2020-02-11
      相关资源
      最近更新 更多