处理UPDATE中的死锁

时间:2019-07-19 02:45:51

标签: mysql mariadb

我遇到了一个僵局问题,但是我没有明确的解决方案。我在每次执行时都以相同的方式对查询进行排序,我认为这会阻止其他进程也将其锁定。请记住,此查询每秒可以被打几十次。

死锁查询如下:

BEGIN TRANSACTION
update `user_events`
    set `latest` = 0
    where (`resource_id` = 105
      and `latest` = 1
      and `member_id` = 52632)
      and `eventtype` in ('user_watched', 'user_unwatched');
COMMIT
表:id

PK(查询中不需要) 索引:resource_idmember_idlatest

在此查询之后,我们插入新行,其最新设置为1。因此,上一个查询的工作是为任何给定事件设置Latest = 0,因此我们只关心显示的两个事件中的最新事件。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您需要一个复合索引:

INDEX(resource_id, latest, member_id, eventtype)

(列的顺序可能并不重要。)

如果没有这样的索引,则查找该行的速度会变慢,并且锁定的行会超出必要的范围。

具有索引将消除大多数 死锁。但是您仍然应该检查是否有错误,如果遇到任何错误,请重播事务。