【问题标题】:Why doesn't MySQL JDBC use "Start transaction" query to start transactions?为什么 MySQL JDBC 不使用“开始事务”查询来开始事务?
【发布时间】:2018-12-23 23:37:27
【问题描述】:

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

【问题讨论】:

  • 因为开发人员确实是这样实现的..
  • @CarlosHeuberger 不使用start transaction查询/命令发起交易的原因是什么?
  • 问开发者,我(我们)怎么知道???这不是 Stackoverflow 的问题。
  • 非常感谢@CarlosHeuberger!
  • "set commit = 0" 听起来像是事务的开始;提交显然是结束。您需要将它们配对。

标签: java mysql jdbc jta jconnect


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    MySQL 的 JDBC 驱动程序实现了 Java JDBC API。 java.sql.Connection interface 没有启动事务的方法。

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

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

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

    另见How to start a transaction in JDBC?

    【讨论】:

      猜你喜欢
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      相关资源
      最近更新 更多