我有一个服务,很多人会并行访问数据库。每次,每个人都会请求 50 条尚未处理的记录。例如,
select * from service where update = -1 limit 50;
然后手动更新它们(这意味着它们将被分配不同的值)。 我想做的是将 50 条不同的记录返回给每个人进行更新。实现它的正确方法是什么?
我试过
SELECT ... LIMIT 50 FOR UPDATE;
但它似乎会阻止整个数据库。
不要SELECT ... FOR UPDATE
,而是有一个专门用于声明的列。这是DEFAULT NULL
,但您将使用一些随机或唯一标识符填充它。UUID 或其他离散值将正常工作。
例如:
UPDATE service SET claimed=? WHERE claimed IS NULL LIMIT 50
注意响应中修改的行数。如果它大于零,那么您声明了某些内容:
SELECT * FROM service WHERE claimed=?
这将获取之前声明的值。