MySQL 中的可重复读(Repeatable Read,RR)隔离级别通过几种机制来解决幻读问题:
1. **多版本并发控制(MVCC)**:
在可重复读隔离级别下,MySQL 使用MVCC来管理事务读取的数据版本。这意味着在事务开始时,系统会创建一个Read View(读视图),该视图记录了当前所有活跃事务的ID。当执行SELECT查询时,事务只会看到在它启动时已经提交的事务所写入的数据,以及它自己做的更改。因此,即使其他事务在此期间插入了新行,这些新行对于当前事务来说是不可见的,从而避免了幻读。
2. **Next-Key Locks**:
InnoDB 存储引擎在执行某些类型的查询(如范围查询)时,会使用Next-Key Locks,这是一种组合了记录锁(锁定实际的行)和间隙锁(锁定两个键值之间的范围,防止插入)的锁策略。这种锁机制可以阻止其他事务在当前事务查询的范围内部插入新行,从而避免了幻读现象。例如,如果事务A执行了一个范围查询并获取了相应区间上的Next-Key Locks,那么事务B在这个区间内尝试插入新行将会被阻塞,直到事务A结束。
需要注意的是,虽然可重复读级别通常能有效避免幻读,但在某些特定场景下,如使用锁(如SELECT ... FOR UPDATE 或 SELECT ... LOCK IN SHARE MODE)进行当前读操作时,还是有可能观察到幻读现象。这是因为这类操作会查看并锁定最新的数据,而不是基于事务开始时的Read View。因此,如果在同一个事务中混合使用快照读和当前读,理论上仍存在幻读的可能性。但总体上,可重复读隔离级别通过上述机制极大地减少了幻读发生的概率。
标签:事务,隔离,幻读,查询,重复,mysql,级别 From: https://www.cnblogs.com/maidongdong/p/18170450