【问题标题】:INNODB: What ends a transaction?INNODB:什么结束了交易?
【发布时间】:2016-12-28 17:17:06
【问题描述】:

我的数据库包装器需要知道语句何时作为事务的一部分执行(不是自动提交)。我在调用 beginTransaction() 时设置一个标志,并在调用 commit() 或 rollback() 时再次清除它。

问题是,还有什么可能导致交易结束?例如,我需要检查连接丢失或事务由于死锁而被终止的错误。

【问题讨论】:

    标签: mysql innodb transactions


    【解决方案1】:
    • 任何 DDL (ALTER, DROP, ...) 都会终止事务。 (这与其他供应商不同。)

    • 网络中的故障将终止交易。出于这个原因,它是unwise to have 'auto-reconnect' 开启的。我怀疑如果你有 autocommit=0,你就无法识别打嗝。

    我发现拥有autocommit=0 风险很大——太容易忘记(或失败)执行必要的COMMIT。相反,我更喜欢在 same 客户端子例程中使用 BEGINCOMMIT。是的,这可能会强制以不同方式重组子例程,但是通过将BEGINCOMMIT '一起',我不太可能搞砸事务。

    每个语句之后检查错误。使用 Galera,即使 COMMIT 也会失败。 (因为那是咨询其他节点的时候。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 2015-09-30
      • 2019-10-27
      • 2012-10-09
      • 2018-06-12
      • 2011-03-22
      • 2014-07-10
      相关资源
      最近更新 更多