MySQL:你明确要说哪一行必须被锁定或者INNODB只知道它吗?

时间:2013-04-04 06:45:03

标签: mysql innodb

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

1 个答案:

答案 0 :(得分:1)

如果您创建表格,则无需自行锁定表格 使用Engine = InnoDB选项,将创建一个InnoDB监视器。

CREATE TABLE t (i INT) ENGINE = InnoDB;

监视器自动锁定表,但锁不是单行的InnoDB将锁定操作/事务的漏洞表。

也许用户只想阅读表格,他在洞穴表上获得了锁定。 同时另一个用户也可以读取该表,但如果他想删除一行并且他要求x锁,他必须等待另一个用户,直到他释放他的锁。

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 doc。:

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