我知道 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 处?
最佳答案
如果您创建表,则无需自行锁定表 使用选项 Engine = InnoDB 将创建 InnoDB 监视器。
CREATE TABLE t (i INT) ENGINE = InnoDB;
监视器自动锁定表,但锁定不是针对单行 InnoDB 会为操作/事务锁定空表。
也许用户只想读取表,他获得了孔表上的锁。 同时其他用户也可以读取该表,但如果他想要删除一行并请求 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
关于MySQL:您必须明确说明必须锁定哪一行还是 INNODB 只知道这一点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15804264/