我遇到了一个僵局问题,但是我没有明确的解决方案。我在每次执行时都以相同的方式对查询进行排序,我认为这会阻止其他进程也将其锁定。请记住,此查询每秒可以被打几十次。
死锁查询如下:
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_id
,member_id
,latest
在此查询之后,我们插入新行,其最新设置为1
。因此,上一个查询的工作是为任何给定事件设置Latest = 0
,因此我们只关心显示的两个事件中的最新事件。
非常感谢您的帮助。
答案 0 :(得分:0)
您需要一个复合索引:
INDEX(resource_id, latest, member_id, eventtype)
(列的顺序可能并不重要。)
如果没有这样的索引,则查找该行的速度会变慢,并且锁定的行会超出必要的范围。
具有索引将消除大多数 死锁。但是您仍然应该检查是否有错误,如果遇到任何错误,请重播事务。