2017-07-16 15 views
0

我有一项服务,许多人将并行访问数据库。每次,每个人都会要求提供50条尚未处理的记录。例如,mysql - 返回其他人未更新的行

select * from service where update = -1 limit 50; 

然后手动更新它们(这意味着它们将被分配不同的值)。 我想要做的是将50个不同的记录返回给每个人进行更新。什么是实现它的正确方法?

我已经试过

SELECT ... LIMIT 50 FOR UPDATE; 

但似乎它会阻止整个数据库。

+2

'update'是一个保留关键字,所以在将它用作列名时可能需要将其转义。 – tadman

+0

@tadman我只是举个例子。不是真实的情况。 – cssmlulu

+0

嗯,我们得到的就是这个例子 – Strawberry

回答

0

请勿SELECT ... FOR UPDATE,而是有一个专门用于声明的列。这是DEFAULT NULL,但您将使用一些随机或唯一的标识符来填充它。一个UUID或其他disctinct值将正常工作。

例如:

UPDATE service SET claimed=? WHERE claimed IS NULL LIMIT 50 

,请注意修改的行数的响应。如果它大于零,那么你声称:

SELECT * FROM service WHERE claimed=? 

这将提取以前声称的值。

+0

在我的情况下,这个过程是1)获取50条WHERE声明为空的记录(并阻止它们,以便其他人无法读取/更新它们)2)更新声明的列由一个(这意味着他们被设置为不同的值) 似乎你的解决方案不适合我的情况? – cssmlulu

+0

这是,但你需要一个额外的专栏来声明的目的。锁定记录在实践中是非常糟糕的,它会导致死锁和混乱。使用具有锁定键的列(悲观锁)通常非常可靠。 – tadman