在InnoDB中的MySQL事务中,以SELECT ... FOR UPDATE
模式在REPEATABLE READ
查询上创建间隙锁。
因此,如果事务T1运行查询SELECT * FROM `inventory` WHERE `price`=45545 FOR UPDATE;
,然后T2运行UPDATE `inventory` SET `color`=3 WHERE `price`=45545;
,则由于间隙锁定,T2停顿直到T1完成。此行为很有用,因为T1保持不变,即它对所有具有`price`=45545
的行都具有排他锁。
但是,当没有以`price`=45545
开始的行时,情况似乎并非如此。在这种情况下,不会创建间隙锁定,并且T2成功运行,从而打破了不变性。
即使没有行匹配,有没有办法强迫MySQL进行间隙锁定?