【发布时间】:2019-09-21 23:17:48
【问题描述】:
我需要让 MySQL 服务器在其客户端断开连接后立即回滚事务,因为每个客户端同时工作。可以像这样重现问题(使用 innodb 表类型)
在客户端 A 上:
START TRANSACTION;
SELECT MAX(ID) FROM tblone FOR UPDATE;
#... then disconnect your connection to the server
在客户端 B:
START TRANSACTION;
SELECT MAX(ID) FROM tblone FOR UPDATE;
#... lock wait time out will occur here
我设置了 MySQL 的服务器选项,如 innodb_rollback_on_timeout,并在两个客户端上都使用了 mysql 的客户端 mysql --skip-reconnect。我在网络上使用一台服务器和两个客户端进行了尝试。我在SELECT ... FOR UPDATE; 线之后物理地断开了网络(拔下电缆)。我需要让其他客户端能够立即在事务上使用tblone(锁定它,更新它),为此我认为服务器应该在客户端 A 断开连接后回滚客户端 A 的事务。
【问题讨论】:
-
有趣的问题。我以为这是自动的!所以我们需要像
innodb_rollback_on_disconnect.. 这样的东西,那太好了,我想说,这应该是默认的!这将是对 mysql 的合理更改请求。 -
@Tomas 在 2012 年首次提出这个问题后,我遇到了同样的问题!我编写了一个简单的 python 脚本来模拟这个问题,发现如果第一个客户端失去连接,第二个客户端会立即获得锁。但是我不明白MySQL是怎么做到的,请参考github.com/qiulang/mysql
标签: mysql transactions timeout rollback disconnect