Mysql 如何锁定队列中的行?

Mysql 如何锁定队列中的行?,mysql,concurrency,transactions,locking,Mysql,Concurrency,Transactions,Locking,我有一个类似的用例,但不幸的是解决方案不是我想要的 我有一个队列表,其中包含要由几个同时工作人员处理的行。比如说: 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; 问题是几个并发工作人

我有一个类似的用例,但不幸的是解决方案不是我想要的

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

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;
问题是几个并发工作人员将得到相同的行,这是我必须不惜一切代价避免的

我可以使用事务并
选择。。。对于UPDATE
,它将阻止其他工作程序获取相同的行,但会使它们阻塞,直到第一个事务完成,从而有效地终止所有并发

MySQL中是否有一种内置方法,可以只选择当前未被其他连接锁定的行?


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

您正在寻找一个类似于
SELECT。。。对于更新跳过锁定
。不幸的是,在MySQL中这不是一个选项。然而,在Oracle和PostgreSQL的最新版本中,这是一个很好的概念。

很高兴看到这个概念的存在,当然也很不高兴看到它在MySQL中还不是一个选项。希望有一天!我现在需要一个额外的列和一个PID。谢谢你的回答,今天到了<代码>跳过锁定现在是GA。