【问题标题】:When exactly MySQL locks a row on updating InnoDB table?MySQL 何时在更新 InnoDB 表时锁定一行?
【发布时间】:2011-06-29 18:16:13
【问题描述】:

如果我有这个多重更新查询

UPDATE user u
INNER JOIN user_profile up ON up.user_id = u.id
SET u.name = 'same_name_i_already_had', up.profile.age = 25
WHERE u.id = 10

假设用户表中的第 10 行已经具有名称“same_name_i_already_had”,因此不应更新它。

另一方面,user_profile 表中的行有不同的年龄,所以 MySQL 应该更新它。

假设 MySQL 为 RDBMS,InnoDB 以其行级锁定系统作为两个表的引擎,

MySQL 是否锁定用户表中的行尽管不必更新该行的名称字段?

【问题讨论】:

    标签: mysql locking innodb rowlocking


    【解决方案1】:

    它确实锁定了user 中的行。您可以使用出色的innotop 工具来验证这一点。

    • 运行 innotop 并按“L”键以显示 InnoDB 锁定屏幕。
    • 打开另一个会话,登录 MySQL 并开始交易。
    • 执行您显示的 UPDATE,但不要提交。
    • 在 innotop 屏幕中查看锁。

    例如,我在运行 MySQL 5.5 的测试 VM 上创建了表 user 和 user_profile,并执行了上面列出的步骤。这是输出:

    [RO] Locks (? for help) localhost, 08:34.568, InnoDB 10s :-), 0.10 QPS, 2/0/0 con/run/cac thds, 5.5.
    
    __________________________________________ InnoDB Locks __________________________________________
    ID  Type    Waiting  Wait   Active  Mode  DB    Table         Index    Ins Intent  Special        
     2  TABLE         0  00:00   02:35  IX    test  user                            0                 
     2  RECORD        0  00:00   02:35  X     test  user          PRIMARY           0  rec but not gap
     2  TABLE         0  00:00   02:35  IX    test  user_profile                    0                 
     2  RECORD        0  00:00   02:35  X     test  user_profile  PRIMARY           0  rec but not gap
    

    【讨论】:

    • 很好的答案,但是我不明白显示的 TABLE 锁。你能解释一下 innotop 是什么意思吗?
    • “IX”模式是表级锁定,意思是“我打算锁定此表中的某些行”。它不会阻塞同一张表上的行级锁,但会阻塞表级锁。有关 InnoDB 锁定的完整说明,请参阅dev.mysql.com/doc/refman/5.5/en/innodb-lock-modes.html,有关使用 innotop 的完整说明,请参阅innotop.googlecode.com/svn/html/manual.html
    • 我有过的最佳答案。非常感谢!
    • 某人如何“执行您显示的更新,但尚未提交”。我是 MySQL 新手,正在尝试分析一些更新。
    • @PeterA,使用语句“BEGIN;”开始交易这意味着避免自动提交每个语句。事务将保持打开状态,直到您明确使用“COMMIT;”或“回滚;”欲了解更多信息,请阅读dev.mysql.com/doc/refman/5.7/en/commit.html
    【解决方案2】:

    几乎可以肯定它无论如何都会锁定行。我不知道有哪些简单的字段会首先检查更改。锁定、写入和解锁更容易、更快捷。如果在锁定之前进行了检查,则存在竞争条件:锁定完全避免的事情。

    【讨论】:

      猜你喜欢
      • 2019-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      • 2017-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多