更新时锁定行


lock row while updating

我有一个表,它得到很多调用(大约30/秒),我们称之为service

service构建如下

`id`|`name`|`lastUpdate`|`inUse`|`usedBy`

当我更改其中一行时,我不希望它在任何其他select'update语句中显示,直到更新完成。例如,

会话1:

UPDATE `service` SET `inUse`=1, `usedBy`='xxx' 
WHERE `inUse`=0 ORDER BY `lastUpdate` ASC LIMIT 1

会话2:

UPDATE `service` SET `inUse`=1, `usedBy`='xxx' 
WHERE `inUse`=0 ORDER BY `lastUpdate` ASC LIMIT 1

尽管两个查询在同一时刻运行,我希望它们更新不同的行。

我知道有一些关于这个问题的文章,但由于某种原因,每篇文章的答案都不同,可能随着时间的推移而改变。我正在使用教条,但我不介意使用常规mysql解决方案

尽管两个查询在同一时刻运行,我希望它们更新不同的行。

没有,对吧?像UPDATE这样的DML语句在表/行上使用隐式锁,因此一旦UPDATE发生,另一个UPDATE/INSERT就不能发生,因为它已经获得了表上的排他锁。

参见InnoDB中不同SQL语句设置的锁

我不完全确定这是否是最佳实践,但您可以锁定表

LOCK TABLE `service` WRITE;
UPDATE `service` SET `inUse`=1, `usedBy`='xxx' 
WHERE `inUse`=0 ORDER BY `lastUpdate` ASC LIMIT 1;
UNLOCK TABLES;