java - 如何设置自动提交关闭,有助于在 JDBC 中启动事务?
问题描述
许多文章和文档说,通过关闭 Auto Commit,您可以在 JDBC 中启动事务。这个话题也问了同样的问题,但它没有回答这个问题,只是说:
更改自动提交模式会触发当前事务的提交(如果一个处于活动状态)。
好的。但接下来呢?
为了找到答案,我搜索并找到了这个:
- 自动提交事务:
每个单独的语句都是一个事务。
- 显式交易:
每个事务都以 BEGIN TRANSACTION 语句显式启动,并以 COMMIT 或 ROLLBACK 语句显式结束。
- 隐式交易:
前一个事务完成时会隐式启动新事务,但每个事务都使用 COMMIT 或 ROLLBACK 语句显式完成。
然后我发现了这个:
提交交易
禁用自动提交模式后,在显式调用 commit 方法之前不会提交任何 SQL 语句。在上一次调用该方法之后执行的所有语句
commit
都包含在当前事务中,并作为一个单元一起提交。
因此我得出结论,在禁用自动提交模式后,我们处于隐式模式,我们也知道为了禁用自动提交,已经运行了一个 COMMIT 语句,因此在关闭自动提交后,我们开始了一个新的交易。
我们能根据这些案例得出这样的结论吗?这是一个正确的结论吗?
解决方案
你不能。在 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)
不会启动任何事务。只有在执行了一条语句(或其他需要事务的操作)时,如果没有活动事务,才会启动一个事务。
推荐阅读
- c++ - 需要不同的 LED 以在 arduino 上的电位器的不同级别打开
- python - 使用具有不同值的新列复制 DataFrame
- python - 尝试使用 OpenTelemetry python 库导入 StatusCanonicalCode 时出现导入错误
- python - laggy pygame 在 Windows 10 上的 pycharm 上运行
- reactjs - 组件在 react-redux 应用程序中意外卸载
- visual-studio - 有一种方法可以在 tfs、visual studio 2019 上找到更改的单行吗?
- cordova - 游戏商店会拒绝任何适用于 13 岁以下儿童的 cordova (webview) 应用程序吗?有什么办法吗?
- c - 二叉搜索树无法正常工作,但代码运行良好
- php - 更改 PHP 代码。日历事件数据未正确生成
- azure - 如何在天蓝色搜索中搜索特殊字符和带有特殊字符的单词?