mysql - 更新时锁定行

时间:2015-09-03 23:23:34

标签: php mysql doctrine-orm

我有一张桌子可以收到很多电话(大约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解决方案

2 个答案:

答案 0 :(得分:1)

  

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

不,对吗? AFAIK,像UPDATE这样的DML语句在表/行上采用隐式锁定,因此一旦UPDATE发生,另一个UPDATE / INSERT就不会发生,因为它已经获得了独家锁在桌子上。

请参阅Locks Set by Different SQL Statements in InnoDB

答案 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.