如何锁定队列中的行



我有一个用例类似于如何在mysql中锁定行而不阻塞?,但不幸的是,解决方案不是我想要的。

我有一个队列表,其中包含要由几个同时工作的人员处理的行。举个例子:

CREATE TABLE queue (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  done TINYINT UNSIGNED NOT NULL,
  PRIMARY KEY (id)
);

每个工人都会找到几行要处理:

SELECT * FROM queue WHERE done = 0 LIMIT 10;

问题是,几个并发工作者将获得相同的行,这是我必须不惜一切代价避免的。

我可以使用事务和SELECT ... FOR UPDATE,这将阻止其他工作程序获得相同的行,但会使它们阻塞,直到第一个事务完成,从而有效地扼杀所有并发。

MySQL中有没有内置的方法可以只选择当前未被另一个连接锁定的行

我知道我可以通过添加一个额外的列来解决这个问题,每个进程都会用一个唯一的ID来更新这个列,以便为自己分配一行,但如果有内置的方法,那就更好了。

您正在寻找一个类似于SELECT ... FOR UPDATE SKIP LOCKED的概念。不幸的是,这在MySQL中不是一个选项。然而,在Oracle和PostgreSQL的最新版本中也是如此。

最新更新