我有一个表,它得到很多调用(大约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;