gpt4 book ai didi

MySQL 更新并获取行...或者只选择未锁定的行?

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

我有一个复杂的查询,最终返回一个小部件 - 空闲时间最长的那个。简单。

问题:我有很多任务需要找到最长空闲的小部件。 (请记住,对此的查询很复杂 - 它不能简化为单个空闲小部件队列。)这些小部件可能存在相当大的争用 - 可能有几十个被归类为最长的小部件 -空闲小部件,每个小部件适用于一组不同的条件。尽管如此,单个 Widget 可能有数十个进程,单个 Widget 满足这些进程的约束,所有进程同时进行查询。

这就是麻烦所在。我可以运行我的复杂查询:

SELECT DISTINCT widgets.id FROM widgets INNER JOIN other_thing
ON .............
WHERE widgets.claimed = 0 ######## !!!!!!!!!!!!!!! ##########
AND other_thing.foobar = "yodeling monkey nuggets"
AND ..........
ORDER BY last_active_time ASC
LIMIT 1

...它返回一个小部件给我,但我必须返回数据库才能设置为 1。在此延迟期间,许多其他进程将有

如何设置此查询,以便它更新该行,并且仅更新该行,并向我返回所声明项目的 ID?

或者,如果有一种方法可以跳过选择中已锁定的行,我可以切换到 SELECT FOR UPDATE,但我认为 MySQL 不支持这一点。

最佳答案

如果您使用的是 MYSQL 8.0 或更高版本,是的,有“SKIP LOCKED”。

您的查询看起来像这样

SELECT DISTINCT widgets.id FROM widgets INNER JOIN other_thing
ON .............
WHERE widgets.claimed = 0 ######## !!!!!!!!!!!!!!! ##########
AND other_thing.foobar = "yodeling monkey nuggets"
AND ..........
ORDER BY last_active_time ASC
LIMIT 1 FOR UPDATE OF widgets SKIP LOCKED

https://mysqlserverteam.com/mysql-8-0-1-using-skip-locked-and-nowait-to-handle-hot-rows/

关于MySQL 更新并获取行...或者只选择未锁定的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49203334/

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