首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >MySQL更新并获取行...或者可能只选择未锁定的行?

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

Stack Overflow用户
提问于 2018-03-10 06:48:35
回答 1查看 42关注 0票数 0

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

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

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

代码语言:javascript
代码运行次数: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

...which向我返回了一个小部件,但我必须返回数据库将claimed设置为1。

我如何设置这个查询,使其更新一行,并且只更新一行,并向我返回申请的物品的ID?

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

EN

回答 1

Stack Overflow用户

发布于 2018-08-02 23:06:12

如果您使用的是MYSQL 8.0或更高版本,会有“跳过锁定”。

您的查询将如下所示

代码语言:javascript
代码运行次数: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/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49203334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档