我需要澄清一下MySQL文档的摘录:
...conflicting锁可以通过不同的事务保持在间隙上。例如,事务A可以在间隙上持有共享间隙锁(间隙S-锁),而事务B可以在同一间隙上持有独占间隙锁(间隙X-锁). InnoDB中的gap锁“纯粹是禁止的”,这意味着它们只会阻止其他事务插入到Gap。它们不会阻止不同的事务在相同的间隙上使用gap锁。因此,间隙X锁具有与间隙S锁相同的效果.
我有一个表"aaa“,有两个列- number (主索引)和"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中的语句获取记录"mark = 6“和前面的间隙的x锁。
现在,Window2中的语句要求在完全相同的记录和间隙上设置一个s锁,这(根据docs)应该被授予绝对的权限--但它不是!
我哪里出错了?
发布于 2018-11-06 17:44:59
你有标记< 6的数据吗?如果是这样的话,X记录锁将与gap锁一起由第一个事务授予。第二笔交易无法获得这些记录上的S记录锁。
https://stackoverflow.com/questions/48936811
复制相似问题