InnoDB的“一致性非锁定读”是RR级别下SELECT默认行为不加锁、读事务启动时的快照依赖MVCC和undo log若undo被清理或活跃事务列表失效则退化为锁定读。什么是InnoDB的“一致性非锁定读”它不是某种开关或配置项而是SELECT在可重复读RR隔离级别下默认的行为不加锁、读的是某个时间点的快照。关键在于“不加锁”不等于“不查”而是避开行锁靠MVCC多版本并发控制回溯到事务开始时已提交的数据版本。容易误解的是以为“非锁定读”“随便读”。其实它严格依赖事务启动时机、undo log保留情况和活跃事务列表——只要这些链路断了快照就不可用要么报错要么退化成锁定读。RR级别下SELECT什么时候会变成锁定读显式加锁或隐式触发都会绕过快照读。最常见的是以下几种情况语句里写了SELECT ... FOR UPDATE或SELECT ... LOCK IN SHARE MODE在UPDATE/DELETE语句的WHERE条件中引用了该表即使没写SELECTInnoDB也会先做一次当前读来定位记录查询涉及UNIQUE索引等值查找且记录存在时如果该记录被其他事务修改但未提交当前事务可能触发“一致性检查失败”被迫转为当前读以确认最新状态使用READ COMMITTED隔离级别时每次SELECT都重新生成Read View看似“更实时”实则快照粒度变细、undo压力更大READ VIEW是怎么生成和复用的事务开启第一条SELECT不含锁时InnoDB会创建一个READ VIEW里面固化了当时所有活跃事务ID的上下界m_up_limit_id、m_low_limit_id以及活跃事务ID列表m_ids。后续同事务内所有快照读都复用这个视图。 跃问 跃问是由阶跃星辰开发的免费AI智能问答助手随时帮你智能搜索、高效阅读、识图理解、和你畅聊感兴趣的话题。