mysql deadlock 自动重试_如何避免mysql’死锁发现时尝试获取锁定;尝试重新启动事务’...

一个可以帮助大多数死锁的简单技巧是以特定顺序对操作进行排序。

当两个事务试图以相反的顺序锁定两个锁时,您会遇到死锁,即:

>连接1:锁定键(1),锁定键(2);

>连接2:锁定键(2),锁定键(1);

如果两者同时运行,则连接1将锁定键(1),连接2将锁定键(2),并且每个连接将等待另一个释放键 – >僵局。

现在,如果您更改了查询,以便连接将按相同的顺序锁定键,即:

>连接1:锁定键(1),锁定键(2);

>连接2:锁定键(1),锁定键(2);

它将不可能得到一个死锁。

所以这是我的建议:

>确保没有其他查询,一次锁定访问多个键,除了delete语句。如果你这样做(我怀疑你这样做),请按照升序排列它们的(WHERE in)(k1,k2,… kn)。

>修复您的删除语句以升序工作:

更改

DELETE FROM onlineusers WHERE datetime <= now() - INTERVAL 900 SECOND

DELETE FROM onlineusers WHERE id IN (SELECT id FROM onlineusers

WHERE datetime <= now() - INTERVAL 900 SECOND order by id) u;

另一个要记住的是,mysql文档建议,如果死锁的客户端应该自动重试。您可以将此逻辑添加到您的客户端代码。 (说,在放弃之前,重试这个特定错误3次)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值