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

标签 mysql locking

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

问题:我有很多任务需要找到最长空闲的小部件。 (请记住,对此的查询很复杂 - 它不能简化为单个空闲小部件队列。)这些小部件可能存在相当大的争用 - 可能有几十个被归类为最长的小部件 -空闲小部件,每个小部件适用于一组不同的条件。尽管如此,单个 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/

相关文章:

MySQL 重写不带 IN 子句的查询

ruby-on-rails-3 - SELECT FOR UPDATE 不会在带有 PostgreSQL 9.1 的 Rails 3.2.11 上阻塞

node.js - 为什么 fs.createReadStream ... pipe(res) 锁定读取的文件?

C++11 线程卡在锁定互斥锁上

c# - SemaphoreSlim 在极端条件下无法工作?

c# - 写入文件时如何等待

c++ - 通过 C++ 连接到 mySQL

在 Java Swing 应用程序中关闭 Hibernate Session 时出现 java.lang.NoSuchMethodError

Mysql查询需要很长时间才能执行

php - 在 GitHub 上 stash 公共(public)协作的数据库登录信息的最佳方法是什么?