【问题标题】: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 specification 在 10.1 事务边界和自动提交节中说:
何时开始新事务是由以下隐含的决定
JDBC 驱动程序或底层数据源。虽然有些
数据源实现显式的“开始事务”语句,
没有 JDBC API 可以这样做。通常,开始一个新事务
当当前 SQL 语句需要一个而没有
交易已经到位。是否给定的 SQL 语句
SQL:2003 也指定了需要事务。
Connection 属性 auto-commit 指定何时结束
交易。启用自动提交后会导致事务提交
一旦该语句完成,每个单独的 SQL 语句。
一个陈述被认为是“完整”的点取决于
关于 SQL 语句的类型以及应用程序的功能
执行后:
- 对于数据操作语言 (DML) 语句,例如 Insert、Update、Delete 和 DDL 语句,语句会尽快完成
因为它已完成执行。
- 对于
Select 语句,当关联的结果集关闭时,语句就完成了。
- 对于
CallableStatement 对象或返回多个结果的语句,当所有关联的
结果集已关闭,所有更新计数和输出
已检索参数。
换句话说,当您调用connection.setAutoCommit(false) 时,不会启动任何事务。只有在执行了一条语句(或其他需要事务的操作)时,如果没有活动事务,才会启动事务。