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。