我在 MySQL 5.6.13 上运行这些查询。我使用可重复的读取隔离级别。该表如下所示:
在会话 A 终端中,我发布了以下声明
UPDATE manufacurer
SET lead_time = 2
WHERE mname = 'Hayleys';
在会话 B 终端中,我尝试将 ACL 电缆的值 lead_time 更新为 2。但由于会话 A 的先前 UPDATE 命令尚未提交(并且会话 A 对制造商表具有排他锁),因此此更新等待。这个我能理解。
但是当我尝试在会话 B 上执行 SELECT 语句时,如下所示,
SELECT * FROM manufacturer
WHERE mcode = 'ACL';
它正确查询制造商表并给出该行。这怎么可能发生?因为会话 A 仍然在制造商表上持有排他锁,并且据我所知,当在表上持有排他锁时,在提交前一个事务之前,没有其他事务可以读取或写入它。