为什么MySQL JDBC不使用“启动事务”查询来启动事务?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么MySQL JDBC不使用“启动事务”查询来启动事务?相关的知识,希望对你有一定的参考价值。

我有一个Java应用程序,它使用JTA(Apache Geronimo)来管理事务。正在使用的数据库是mysql。 App有很多开始和提交方法。但是看看MySQL通用日志,我找不到一个“启动事务”查询/命令。日志充满了SET autocommit=1SET autocommit=0commitrollback。因此,查看日志我无法确定交易开始的时间点。我不是一个Java人,我也找不到任何帮助资源。

答案

在MySql InnoDB中使用了启动事务和提交语句。但在MySQL MyISAM中,这些命令无效,因此您需要使用set autocommit = 0而不是Start Transaction和set autocommit = 1来代替commit; InnoDB允许这两种方式,但MyISAM只允许设置自动提交。另请注意,这些命令执行的工作有些类似,但它们并不完全相同。并且不建议在InnoDB中使用set autocommit。有关更多信息,请参阅StackOverflow中的this question

另一答案

MySQL的JDBC驱动程序实现了Java JDBC API。 java.sql.Connection interface没有开始交易的方法。

执行SQL查询时,事务会隐式开始。

如果驱动程序处于自动提交模式,则在SQL查询完成后将自动提交事务。

如果驱动程序未处于自动提交模式,则查询启动的事务将保持活动状态,直到您调用Connection.commit()Connection.rollback()

另见How to start a transaction in JDBC?

以上是关于为什么MySQL JDBC不使用“启动事务”查询来启动事务?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JDBC 中启动事务?

MySQL 错误:超过锁定等待超时;尝试重新启动事务查询

为啥 SELECT 查询不启动事务? [甲骨文]

使用 MySQL 和 JDBC 准备语句缓存

使用Python 3.6启动事务mysql-connector-python不返回任何结果

使用 C# 在 Mysql 上死锁 - “超过锁定等待超时;尝试重新启动事务”