gpt4 book ai didi

mysql - 处理 UPDATE 中的死锁

转载 作者:行者123 更新时间:2023-11-29 15:45:29 25 4
gpt4 key购买 nike

我遇到了僵局问题,并且没有明确的解决方案来解决它。我在每次执行时都以相同的方式订购查询,我认为这也可以防止其他进程锁定它。请记住,该查询每秒可能会被点击数十次。

死锁查询如下:

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

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

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

非常感谢任何帮助。

最佳答案

您需要一个复合索引:

INDEX(resource_id, latest, member_id, eventtype)

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

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

拥有索引将消除大多数死锁。但您仍然应该检查错误并在出现任何错误时重播交易。

关于mysql - 处理 UPDATE 中的死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57104872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com