从“实时性”角度看,这确实不够新;但从“事务内结果稳定”角度看,这正是可重复读想要的效果。
为什么它会读到旧值
因为普通查询走的是快照读。事务第一次形成一致性视图后,后续普通 select 会继续基于这份视图读取,所以别人已经提交的新值,你暂时看不到。
为什么数据库还要这样设计
因为很多业务更怕“前后两次统计口径变了”。报表、批量结算、复杂事务处理时,如果同一事务里看到的数据一直跳动,逻辑反而更难保证正确。
那会不会把数据改错
通常不会。因为真正执行 update 这类写操作时,数据库会做当前读,基于最新可写版本处理,不是机械地拿快照里的旧值直接覆盖。
什么时候它不合适
库存扣减、抢购、余额判断这类特别强调最新状态的场景,往往需要当前读或更明确的并发控制,而不是只依赖快照读结果做决策。
结论
可重复读不是追求“你看到的一定最新”,而是追求“同一事务里你看到的口径保持一致”。
正文完




