Skip to content
About
Main content

What transactional isolation forbids

Why is the isolation-level taxonomy broken?

Why the taxonomy is broken, precisely

Berenson et al. (1995) is worth reading in full. The load-bearing failures of the ANSI scale are:

  • The levels are defined by prohibited phenomena, stated so ambiguously that the literal reading does not exclude what was intended.
  • Dirty write is omitted entirely, although it must be excluded at every level.
  • is not expressible on the scale at all. It prevents all three ANSI anomalies and is still not .
  • The levels stop being totally ordered the moment SI exists.

The structural cause is a general lesson: the standard was written against one mechanism family () and then had to name the products of another (multiversioning). Vendors attached SI to whichever existing name was least embarrassing. PostgreSQL chose . Oracle chose Serializable. The confusion in the field comes from that one decision, not from anybody's misunderstanding.

The directive is therefore:

  1. Use Adya's phenomena, never the ANSI ones.
  2. Read the vendor's own documentation for what is actually prevented.
  3. Treat a level name in a configuration file as the starting point for a three-transaction test, not as a guarantee.

Synthesis of this article

What this article forbids

  • A level that prevents without tracking reads. SI's ceiling is structural, not an implementation gap: write-set validation cannot see rw edges.
  • A total order over the standard level names.
  • prevention without either a or /range locks.
  • Noticing an from inside the transaction that suffers it. That transaction sees only legal values.
  • Lost-update prevention at RC without commutativity, a lock or a version check.
  • Recency as a consequence of serializability.
  • A level name meaning the same thing in two engines.

Escapes and what each costs

EscapeBuysPays
the operationLevel-independenceOnly exists where an algebra does
Single-row constraintFree enforcement at any levelThe must fit in one row
Shrink the read-to-write up to 10⁴× (typically 10³×) fewer Logic must move into the engine
/ FOR UPDATELost-update immunityBlocking, and deadlock risk
Version check ()Lost-update immunity, no blockingA retry loop, and something must own it
Snapshot isolationNon-blocking readers, no read trackingWrite skew, and an analysis burden
Write-skew immunity under SIFalse conflicts, and it silently rots
Serializable ()Compositional correctnessFalse , read-tracking memory
Serializable (2PL)Compositional correctnessBlocking, W grows, and conflict grows as W²

(The last row: with 2PL, a longer wait makes transactions hold locks longer, which raises the chance that others collide with them. Conflict grows roughly with the square of the hold time.)