首页 >数据库 >mysql教程 >如何防止 MySQL 在线用户跟踪系统中出现'尝试获取锁定时发现死锁”错误?

如何防止 MySQL 在线用户跟踪系统中出现'尝试获取锁定时发现死锁”错误?

Linda Hamilton
Linda Hamilton原创
2024-12-15 18:52:15313浏览

How Can I Prevent

避免 MySQL 中的“尝试获取锁定时发现死锁”

问题:

开发人员遇到间歇性的“尝试获取锁定时发现死锁;在跟踪在线用户活动的 InnoDB 表中运行 INSERT 时,尝试重新启动事务'错误。该表在页面刷新时更新,并由 cron 作业每 15 分钟清除一次。

有问题的查询:

  • 首次访问:INSERT INTO onlineusers (ip 、日期时间、用户 ID、页面、区域、类型)值(ip、now()、用户 ID、'/thispage'、 'thisarea', 3)
  • 页面刷新: UPDATE onlineusers SET ip = ip, datetime = now(), userid = userid, page = '/thispage', area = 'thisarea', type = 3 WHERE id = 888
  • 每 15 分钟执行一次 Cron 作业:DELETE FROM onlineusers WHERE datetime

解决方案:

要解决死锁,确保事务以一致的顺序锁定键至关重要。以下是建议的步骤:

  1. 查询中的键顺序:

    • 确保所有锁定多个键的查询都按升序排列订购键。
  2. 对删除语句进行排序:

    • 修改 DELETE 语句以包含检索主键值的子查询(在本例中为 id)按升序排列,例如this:
    DELETE FROM onlineusers
    WHERE id IN (
        SELECT id
        FROM onlineusers
        WHERE datetime <= now() - INTERVAL 900 SECOND
        ORDER BY id
    ) u;
  3. 重试机制:

    • 考虑在客户端代码中为此特定实现重试机制错误,允许它自动重试有限次数次。

以上是如何防止 MySQL 在线用户跟踪系统中出现'尝试获取锁定时发现死锁”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn