MySQL文档说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语句锁定行(例如update、select for update、select lock in share模式、insert、delete)完全同时到达MySQL,我想MySQL会顺序地对待它们。只是想确定一下,我正在正确地思考MySQL是如何内部工作的。
发布于 2014-02-27 12:45:37
锁定操作必须序列化。在服务器逻辑工作流中的纳秒级,不存在“同时进行多个锁请求”的情况。即使存在,服务器的逻辑也会任意地将它们按某种顺序排列,并一个接一个地授予它们。
真正聪明的下一代大规模并行服务器可能会发现不同的锁请求绝对不会相互干扰,并且能够真正并行地处理它们。但就目前而言,没有一种东西是同时发生的。
https://stackoverflow.com/questions/22068335
复制相似问题