【发布时间】:2016-12-28 17:17:06
【问题描述】:
我的数据库包装器需要知道语句何时作为事务的一部分执行(不是自动提交)。我在调用 beginTransaction() 时设置一个标志,并在调用 commit() 或 rollback() 时再次清除它。
问题是,还有什么可能导致交易结束?例如,我需要检查连接丢失或事务由于死锁而被终止的错误。
【问题讨论】:
标签: mysql innodb transactions
我的数据库包装器需要知道语句何时作为事务的一部分执行(不是自动提交)。我在调用 beginTransaction() 时设置一个标志,并在调用 commit() 或 rollback() 时再次清除它。
问题是,还有什么可能导致交易结束?例如,我需要检查连接丢失或事务由于死锁而被终止的错误。
【问题讨论】:
标签: mysql innodb transactions
任何 DDL (ALTER, DROP, ...) 都会终止事务。 (这与其他供应商不同。)
网络中的故障将终止交易。出于这个原因,它是unwise to have 'auto-reconnect' 开启的。我怀疑如果你有 autocommit=0,你就无法识别打嗝。
我发现拥有autocommit=0 风险很大——太容易忘记(或失败)执行必要的COMMIT。相反,我更喜欢在 same 客户端子例程中使用 BEGIN 和 COMMIT。是的,这可能会强制以不同方式重组子例程,但是通过将BEGIN 和COMMIT '一起',我不太可能搞砸事务。
在每个语句之后检查错误。使用 Galera,即使 COMMIT 也会失败。 (因为那是咨询其他节点的时候。)
【讨论】: