我知道INNODB有行级锁定。所以如果我这样做:
LOCK TABLES users WRITE
SELECT credits FROM users WHERE userid = 1;
UPDATE users SET credits = ([CREDITS] + 100) WHERE userid = 1;
UNLOCK TABLESinnoDB是否足够智能,可以只锁定第二行,或者为了只锁定该行,我还必须采取其他步骤吗?为什么innodb只知道在我的持续时间内锁定这个用户?它是否已经像应该的那样锁定在SELECT上?
发布于 2013-04-04 15:06:25
如果使用选项Engine = InnoDB创建表,则不需要自己锁定表,将创建一个InnoDB监视器。
CREATE TABLE t (i INT) ENGINE = InnoDB;监视器自动锁定该表,但该锁不是针对单行的,InnoDB将针对操作/事务锁定孔表。
也许用户只想读取该表,他就获得了孔表上的s锁。同时,另一个用户也可以读取表,但是如果他想删除一行并请求x锁,他必须等待另一个用户,直到他释放了他的s锁。
MYSQL锁类型兼容性矩阵。
X IX S IS
X Conflict Conflict Conflict Conflict
IX Conflict Compatible Conflict Compatible
S Conflict Conflict Compatible Compatible
IS Conflict Compatible Compatible Compatible请阅读mysql文档:
InnoDB监视器- http://dev.mysql.com/doc/refman/5.1/en/innodb-monitors.html
InnoDB锁定模式- http://dev.mysql.com/doc/refman/5.1/en/innodb-lock-modes.html
https://stackoverflow.com/questions/15804264
复制相似问题