我有一个类似于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来更新,以便为自己分配行,但如果有内置的方式,那就是很多更好。
答案 0 :(得分:2)
您正在寻找与SELECT ... FOR UPDATE SKIP LOCKED
类似的概念。不幸的是,这不是MySQL的选择。但是,它是在Oracle和PostgreSQL的最新版本中。