我需要使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的事务。
innodb_rollback_on_timeout
mysql --skip- reconnect
SELECT ... FOR UPDATE;
tblone
当您物理上断开客户端的连接时,您不会发送正常的断开连接(这会导致回滚),并且MySQL协议不是很健谈,因此服务器永远不会知道客户端不在那里。与客户端和服务器内部进行更多对话的其他数据库系统相比,我认为这是协议中的缺陷。
无论如何。您可以更改两个变量。他们基本上是相同的,只是针对不同的客户。
第一个是wait_timeout,它由Java或php之类的应用程序客户端使用。
另一个是interactive_timeout,它由mysql客户端使用(如您的测试中)
在这两种情况下,服务器都会在几秒钟后终止连接,并且这样做会回滚所有事务并释放所有锁。