0

我知道 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 上?

4

1 回答 1

1

如果使用选项 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

于 2013-04-04T07:06:25.167 回答