明确幻读概念,隔离级别为可重复读时,事务前后查询到其他事务插入的数据。强调读取到新插入数据。解决方案需考虑可重复读隔离级别。讨论可重复读下幻读问题。可重复读为当前读,查询提交数据并带悲观锁;快照读则基于readView和undolog读取数据。问题在于,当前读可能违背可重复读隔离级别。假设执行`SELECT...
mysql可重复读的幻读解决方案
明确幻读概念,隔离级别为可重复读时,事务前后查询到其他事务插入的数据。强调读取到新插入数据。解决方案需考虑可重复读隔离级别。
讨论可重复读下幻读问题。可重复读为当前读,查询提交数据并带悲观锁;快照读则基于readView和undolog读取数据。问题在于,当前读可能违背可重复读隔离级别。
假设执行`SELECT * FROM TABLE WHERE d = 5 FOR UPDATE`,锁定扫描数据。T2阶段的update操作会被阻塞,因所有扫描数据被锁定。此操作仍然可能违背可重复读隔离级别。
为解决幻读,需锁定所有扫描记录及不存在的d=5记录。当前查询结果完全满足可重复读要求。推论总结,在可重复读隔离级别下,解决幻读需锁定扫描记录和间隙,通过间隙锁解决。2024-09-28