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

时间:2018-03-09 22:48:35

标签: mysql locking

我有一个复杂的查询,最终会返回一个Widget - 一个空闲时间最长的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

...将小部件返回给我,但我必须返回数据库 在此延迟期间,许多其他流程将具有

如何设置此查询以便它更新那一行,而且只有该行,AND会向我返回所声明项目的ID?

或者,如果有一种方法可以跳过select中已经锁定的行,我可以切换到SELECT FOR UPDATE,但我收集MySQL并不支持这个。

1 个答案:

答案 0 :(得分:0)

如果您使用的是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/