我需要让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的事务.
解决方法:
当您在物理上断开客户端连接时,您没有发送正常断开连接(这会导致回滚),并且MySQL协议不是很繁琐,因此服务器永远不会知道客户端不存在.我认为,与其他客户端和服务器内部会话更多的数据库系统相比,这是协议中的一个缺陷.
无论如何.您可以更改两个变量.他们基本上做同样的事情,但对不同的客户.
第一个是wait_timeout,它被java或php等应用程序客户端使用.
另一个是interactive_timeout,它由mysql客户端使用(如在你的测试中)
在这两种情况下,服务器都会在几秒钟后终止连接,这样做会回滚所有事务并释放所有锁.