【发布时间】: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 内部的工作方式是正确的。
【问题讨论】: