您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何避免mysql'试图获取锁时发现死锁;尝试重新开始交易”

如何避免mysql'试图获取锁时发现死锁;尝试重新开始交易”

一个可以解决大多数僵局的简单技巧就是按特定顺序对操作进行排序。

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

如果两个都同时运行,则连接1将锁定键(1),连接2将锁定键(2),每个连接将等待另一个释放键->死锁。

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

陷入僵局是不可能的。

所以这是我的建议:

确保除了delete语句外,没有其他一次锁定访问多个键的查询。如果您这样做(我怀疑您这样做),请按升序在(k1,k2,.. kn)中订购他们的WHERE。

修复您的delete语句以升序工作:

更改

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个重试此特定错误)。

MySQL 2022/1/1 18:18:51 有516人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶