我有一个复杂的查询,它最终返回一个Widget -空闲时间最长的那个。很简单。
问题:我有很多任务需要找到空闲时间最长的Widget。(请记住,这方面的查询很复杂-它不能简化为空闲小部件的单个队列。)对于这些小部件可能存在相当大的争执-可能有几十个小部件被归类为空闲时间最长的小部件,每个小部件对应一组不同的条件。尽管如此,单个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
...which向我返回了一个小部件,但我必须返回数据库将claimed设置为1。
我如何设置这个查询,使其更新一行,并且只更新一行,并向我返回申请的物品的ID?
或者,如果有一种方法可以跳过select中已经锁定的行,我可以切换到SELECT FOR UPDATE,但我猜MySQL不支持这一点。
发布于 2018-08-02 15:06:12
如果您使用的是MYSQL 8.0或更高版本,会有“跳过锁定”。
您的查询将如下所示
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/
https://stackoverflow.com/questions/49203334
复制相似问题