Transactions & Concurrency

Read Committed and Repeatable Read

Read Committed normally chooses a fresh committed view per statement; Repeatable Read aims for stability across a transaction, but locking, snapshot timing, predicate handling, and even supported names differ materially across engines.
  • Read Committed prevents dirty reads, not stale decisions.
  • Repeatable Read is not one algorithm.
  • Plain and locking reads differ.
  • Snapshot scope matters.
  • Writes still need a concurrency strategy.
Fuzzy read under Read Committed
Start: order 42 status=PENDING; invariant: one transaction’s approval decision uses one stated order state.
T1 reads PENDING. T2 writes CANCELLED and commits. T1 reads CANCELLED.
Both values were committed, but T1 did not observe a stable premise.
Current vendor behavior—verify configuration and access path
Engine / levelTypical read viewImportant qualification
PostgreSQL 18 RCStatement snapshotEach command may see a newer commit
PostgreSQL 18 RRTransaction snapshotSnapshot isolation; serialization-style update conflicts, no phantoms in docs table
MySQL 8.4 InnoDB RCFresh snapshot per consistent readGap locking reduced; locking reads differ
MySQL 8.4 InnoDB RRSnapshot from first consistent readDefault; next-key locks for locking/index scans
SQL Server 2025 RCLocking RC or statement row versionsREAD_COMMITTED_SNAPSHOT changes mechanism
SQL Server 2025 RRShared locks retained to commitNew predicate rows can still appear
Oracle 26ai RCStatement-level read consistencyDefault; no named RR level
SQLiteSerialized writes; snapshot isolation in WALread_uncommitted matters only with shared cache; one writer

The table deliberately does not collapse equal names. PostgreSQL Repeatable Read is snapshot-based; SQL Server Repeatable Read is lock-based and does not protect new qualifying rows; Oracle exposes Read Committed and Serializable rather than a separately named Repeatable Read.