mysql 事务中断_具有丢失/断开连接的事务上的MySQL回滚

我需要让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客户端使用(如在你的测试中)

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

标签:disconnect,mysql,transactions,rollback,timeout

来源: https://codeday.me/bug/20190926/1821395.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值