一尘不染

连接丢失/断开连接的事务的MySQL回滚

mysql

我需要使MySQL服务器在客户端断开连接后立即回滚事务,因为每个客户端可以同时工作。可以

在客户端A 上重现这些问题(使用innodb表类型) :

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 --skip- reconnect在两个客户端上都使用了mysql的客户端。我在网络上使用一台服务器和两个客户端进行了尝试。下线后,我物理断开了网络连接(拔下电缆)SELECT ... FOR UPDATE;。我需要使其他客户端能够立即tblone在事务上使用(锁定它,更新它),为此,我认为在客户端A断开连接后,服务器应回滚客户端A的事务。


阅读 1051

收藏
2020-05-17

共1个答案

一尘不染

当您物理上断开客户端的连接时,您不会发送正常的断开连接(这会导致回滚),并且MySQL协议不是很健谈,因此服务器永远不会知道客户端不在那里。与客户端和服务器内部进行更多对话的其他数据库系统相比,我认为这是协议中的缺陷。

无论如何。您可以更改两个变量。他们基本上是相同的,只是针对不同的客户。

第一个是wait_timeout,它由Java或php之类的应用程序客户端使用。

另一个是interactive_timeout,它由mysql客户端使用(如您的测试中)

在这两种情况下,服务器都会在几秒钟后终止连接,并且这样做会回滚所有事务并释放所有锁。

2020-05-17