如何锁定队列中的行?

时间:2016-05-05 08:58:39

标签: mysql concurrency transactions locking

我有一个类似于How to lock row in mysql without blocking?的用例,但不幸的是,解决方案并非我所追求的。

我有一个队列表,其中包含要由多个同时工作者处理的行。比如说:

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来更新,以便为自己分配行,但如果有内置的方式,那就是很多更好。

1 个答案:

答案 0 :(得分:2)

您正在寻找与SELECT ... FOR UPDATE SKIP LOCKED类似的概念。不幸的是,这不是MySQL的选择。但是,它是在Oracle和PostgreSQL的最新版本中。