【问题标题】:MySQL: do you explicitly have to say which row must be locked or does INNODB just know it?MySQL:您是否必须明确说明必须锁定哪一行,还是 INNODB 只知道它?
【发布时间】: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。这就是他们的目的!

标签: mysql innodb


【解决方案1】:

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

CREATE TABLE t (i INT) ENGINE = InnoDB;

monitor 自动锁表,但锁不是针对单行 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    相关资源
    最近更新 更多