我有一张桌子可以收到很多电话(大约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解决方案
答案 0 :(得分:1)
不,对吗? AFAIK,像尽管两个查询都在同一时刻运行,但我希望它们能够更新 不同的行。
UPDATE
这样的DML语句在表/行上采用隐式锁定,因此一旦UPDATE
发生,另一个UPDATE
/ INSERT
就不会发生,因为它已经获得了独家锁在桌子上。
答案 1 :(得分:0)
我不完全确定这是最佳做法,但你可以锁定表格
LOCK TABLE `service` WRITE;
UPDATE `service` SET `inUse`=1, `usedBy`='xxx'
WHERE `inUse`=0 ORDER BY `lastUpdate` ASC LIMIT 1;
UNLOCK TABLES;
请参阅MySQL Docs.