Read your own snapshot; commit only if no one wrote what you wrote. Snapshot isolation is strong — it kills dirty reads, non-repeatable reads, and lost updates — yet it is not serializable. The hole has a name: write skew. Rendered, not quoted.
source Berenson, Bernstein, Gray, Melton, O’Neil & O’Neil, A Critique of ANSI SQL Isolation Levels, ACM SIGMOD 1995, pp. 1–10 · doi:10.1145/223784.223785 — SI defined here as the level that first-committer-wins protects, minus serializability.
A multi-version store. Every transaction T takes a start snapshot and reads the newest version committed at or before its start — never anyone’s uncommitted or later write.
Commit rule (first-committer-wins): T aborts if any item in its write-set already has a version committed after T started. Two concurrent writers of the same item — one dies.
That single rule blocks dirty reads, non-repeatable reads, and lost updates by construction. It says nothing about two writers of different items.
A snapshot per transaction is the-mvcc promoted into an isolation level. Multi-version concurrency gives every reader a stable past; SI just adds the write-conflict abort on top.
Strong isolation with exactly one hole — write skew — is the reason Serializable Snapshot Isolation (SSI, Cahill 2008) was later invented: it watches for the dangerous rw-antidependency cycle this sphere exhibits and aborts a transaction to break it.
Re-checks the claim live: is the committed write-skew schedule’s serialization graph acyclic (SI = serializable) or cyclic (SI ≠ serializable)? Flips red the instant window 6 tampers with that claim.
Two doctors on call. x=1 means Dr A on call, y=1 Dr B on call. Invariant: at least one stays on call — x + y ≥ 1.
Both begin concurrently and each asks: “may I go off?” The rule each obeys: go off only if the other is still on call. Both read the same snapshot: x=1, y=1.
“Each transaction was individually correct — each doctor confirmed a colleague was on call before signing off. So the outcome must be correct.”
The wall: correctness composes under serial execution, not under SI. Both read a snapshot taken before either wrote. Each decision was true when read and false when committed. No serial order ever empties the roster; SI does.
SI prevents all anomalies of Serializable.
→ It prevents dirty/non-repeatable reads and lost updates, but admits write skew and read-only anomalies.
First-committer-wins catches every write conflict.
→ Only write-write on the same item. Disjoint write-sets slip through.
SNAPSHOT ISOLATION = ANSI SERIALIZABLE.
→ amber Many engines mislabel it. The write-skew graph carries a cycle — falsifying the label live in window 0.
Plant the disclosed void: assert “SI is serializable” (deny write skew). The schedule still commits, its graph is still cyclic — so the witness in 7 must catch the contradiction.