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如何在内部工作。答案 0 :(得分:2)
锁定操作必然是序列化的。在服务器逻辑工作流的纳秒级别,没有“恰好在同一时刻的多重锁定请求”。即使有,服务器的逻辑也会随意将它们放入某个顺序并一个接一个地授予它们。
一个非常聪明的下一代大规模并行服务器可能能够确定不同的锁定请求保证永远不会相互干扰,并且真正并行处理它们。但就目前而言,没有同时发生的事情。