【发布时间】:2013-04-04 06:45:02
【问题描述】:
我知道 INNODB 有行级锁定。所以如果我这样做:
LOCK TABLES users WRITE
SELECT credits FROM users WHERE userid = 1;
UPDATE users SET credits = ([CREDITS] + 100) WHERE userid = 1;
UNLOCK TABLES
innoDB 是否足够聪明,可以在那一秒内只锁定该行,还是我必须采取其他步骤才能只锁定该行? innodb 怎么知道在我的持续时间内只锁定这个用户?它是否已按应有的方式锁定在 SELECT 处?
【问题讨论】:
-
这只是一个示例,还是您正在使用的代码?为确保您正确执行此操作,您最好在事务中执行
SELEC .. .FOR UPDATE,或在UPDATE users SET credits = credits + 100 WHERE userid = 1; 之类的查询中执行此操作。无需先选择学分,您可以使用查询本身中的列。 -
我关心的是并发性?像这样的查询会 100% 同时工作吗?看起来确实如此。
-
是的。该更新查询是完全安全的,中间没有其他查询。如果您必须做一些更复杂的用户事务,可能像我说的那样使用
SELECT FOR UPDATE。这就是他们的目的!