READ COMMITTED读已提交是数据库事务的四种标准隔离级别之一其余为READ UNCOMMITTED、REPEATABLE READ、SERIALIZABLE。其核心语义是一个事务只能读取到其他事务已经成功提交COMMIT的数据不能读取未提交的中间状态即避免脏读。✅ 优点防止脏读Dirty Read不会读到其他事务回滚前的临时修改。⚠️ 局限性存在不可重复读Non-Repeatable Read同一事务中对同一行数据多次读取可能因其他事务在两次读之间提交了更新UPDATE或删除DELETE导致结果不一致。存在幻读Phantom Read同一事务中执行相同范围查询如SELECT * FROM t WHERE id 10可能因其他事务插入/删除符合该条件的新行而返回不同数量或内容的记录注意是否视为幻读取决于具体数据库实现例如 PostgreSQL 在 READ COMMITTED 下允许幻读而 Oracle 通过多版本控制MVCC避免了幻读但仍有不可重复读。实现机制典型如 PostgreSQL、Oracle、SQL Server 默认基于多版本并发控制MVCC每个查询看到的是事务开始时刻已提交的最新快照或基于行级锁 读锁释放时机如 SQL Server 的锁机制读操作加共享锁但读完立即释放不持续到事务结束 → 导致后续读可能看到新提交值。示例不可重复读-- 事务AREAD COMMITTEDBEGIN;SELECTbalanceFROMaccountWHEREid1;-- 返回 1000-- 此时事务B执行并提交UPDATE account SET balance 1500 WHERE id 1;SELECTbalanceFROMaccountWHEREid1;-- 可能返回 1500不可重复读COMMIT;READ COMMITTED 与 REPEATABLE READ 在防止不可重复读方面的本质区别在于“一致性快照consistent snapshot的创建时机和作用范围不同”✅READ COMMITTED每次 SELECT 都建立一个新快照以该查询开始时刻已提交的最新数据为准同一事务内多次读取同一行若中间有其他事务提交了修改则后续 SELECT 可能读到新值 →无法防止不可重复读快照粒度是语句级statement-level。✅REPEATABLE READ整个事务第一次 SELECT 时创建一个全局快照并在整个事务生命周期内复用该快照后续所有读操作包括相同或不同 SELECT均基于此初始快照无视其他事务后续的提交 →可防止不可重复读快照粒度是事务级transaction-level。 补充说明关键实现差异PostgreSQL / OracleMVCC 实现REPEATABLE READ 级别下严格复用事务启动时的快照不仅防不可重复读通常也防幻读因新插入行的事务ID大于快照时间点不被可见MySQL InnoDBMVCC Next-Key LocksREPEATABLE READ 级别下虽用事务启动快照防不可重复读但仍可能遭遇幻读如 INSERT 新行因此通过间隙锁Gap Lock和临键锁Next-Key Lock在 DML 操作时阻塞插入从而在大多数场景下间接避免幻读但纯快照 SELECT 仍可能幻读需配合加锁读如SELECT ... FOR UPDATE。简言之READ COMMITTED 的“一致性”止于单条语句REPEATABLE READ 的“一致性”贯穿整个事务——这是二者防不可重复读能力差异的根本原因。