我需要澄清MySQL文档摘录:
......冲突的锁可以通过不同的交易保持在一个缺口上。 例如,事务A可以保持共享间隙锁定(间隙S锁定) 事务B持有独占间隙锁定(间隙X锁定)时的间隙 同样的差距...
InnoDB中的差距锁定是“纯粹的抑制”,这意味着它们只是 阻止其他交易插入差距。他们不 防止不同的交易在相同的差距上采取差距锁定。 因此,间隙X锁具有与间隙S锁相同的效果。
我有一张桌子" aaa"有两列 - 数字(PRIMARY INDEX)和" mark" - 没有索引的VARCHAR。现在我执行:
Window1
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;
SELECT * FROM aaa WHERE mark < 6 FOR UPDATE;
Window2
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;
SELECT * FROM aaa WHERE mark < 6 LOCK IN SHARE MODE;
Window1中的语句在记录上获取了一个x锁定&#34; mark = 6&#34;和前面的差距。
现在,Window2中的语句要求对完全相同的记录和间隙进行s锁定,(根据文档)应该立即授予 - 但它不是!
我哪里出错了?
答案 0 :(得分:0)
您是否有标记<6的数据?如果是这样,则第一个事务将授予X记录锁以及间隙锁。第二笔交易无法获得这些记录上的S记录锁定。