【问题标题】:MySQL innodb select for update concurrencyMySQL innodb 选择更新并发
【发布时间】:2014-03-30 20:55:16
【问题描述】:

MySQL documentation 说 SELECT FOR UPDATE 设置了 IX 锁。 IX 锁是意向排他锁,发出时表示“事务 T 打算在扫描的行上设置 X(排他)锁”。这意味着在 SELECT FOR UPDATE 成功之前,它必须先获得 IX,然后再获得 X。MySQL 术语表是这样说的意图排他锁:

意向锁

一种应用于表级别的锁,用于指示事务打算在表中的行上获取哪种锁。不同的事务可以在同一张表上获得不同种类的意向锁,但第一个在表上获得意向排他 (IX) 锁的事务会阻止其他事务在该表上获得任何 S 或 X 锁 .相反,第一个获取表上意向共享 (IS) 锁的事务会阻止其他事务获取表上的任何 X 锁。两阶段过程允许按顺序解决锁请求,而不会阻塞锁和兼容的相应操作。有关此锁定机制的更多详细信息,请参阅第 14.3.5.3 节,“InnoDB 锁定模式”。

另外 IX 和 IX 是兼容的(锁类型兼容性矩阵),这意味着如果事务 1 发出 IX,紧接着另一个并发事务发出 IX,它将成功。

是否有可能同时发出两个并发 IX,并且 MySQL 为同一个表的两个事务授予/获取 IX。或者,如果发出并发 IX,MySQL 在任何时候只授予一个 IX。我认为 MySQL 只授予其中一个,即使在 MySQL 端同时进行调用和触发也是如此。

编辑:基本上,如果我概括我的问题:如果两个(并发)锁定行的 sql 语句(例如更新、选择更新、在共享模式下选择锁定、插入、删除)同时进入 MySQL,我假设 MySQL 按顺序处理它们。只是想确定一下,我认为 MySQL 内部的工作方式是正确的。

【问题讨论】:

    标签: mysql locking innodb


    【解决方案1】:

    锁定操作必然是序列化的。在服务器的逻辑工作流中的纳秒级别,不存在“同一时刻多个锁请求”这样的事情。即使有,服务器的逻辑也会任意将它们排列成某种顺序,并一个接一个地授予它们。

    真正智能的下一代大规模并行服务器可能能够确定不同的锁请求保证不会相互干扰,并真正并行处理它们。但就目前而言,没有同时发生的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-05
      • 2018-02-25
      • 2013-09-25
      • 2011-10-18
      • 2013-01-28
      相关资源
      最近更新 更多