Consistency Models

Serializability vs Linearizability: Two Different Properties

These are confused constantly, including in vendor documentation. Serializability is about transactions being equivalent to some serial order. Linearizability is about single operations respecting real time. Neither implies the other, and the conjunction has its own name — strict serializability — which is what most people mean when they say either word.

▶ Run the lab

The question this answers

The question

My database says it is serializable. Does that mean a read always sees the latest committed write?

The guarantee — the property claimed, and its scope

Serializability: the outcome of executing a set of transactions is equivalent to executing them one at a time in *some* serial order. That order is unconstrained by real time. Linearizability: each single operation on a single object appears to take effect at an instant within its own interval, and that instant respects real time. Strict serializability is the conjunction: some serial order, and that order is consistent with real time.

Everything below is bought to hold this sentence. "Strongly consistent" with no scope attached is a slogan, not a guarantee — read what it actually covers, and what it explicitly does not.

What a node knows — observation versus inference

A node executing a transaction knows the versions it read and the locks or timestamps it holds. Serializability can be enforced locally by a single-node concurrency-control mechanism — it needs no notion of global time. Linearizability cannot, because it constrains order against real time, which no node can observe. That asymmetry is why a single node is trivially strictly serializable and a cluster is not.

A node knows its own state and the messages that arrived. Everything else is inference from evidence that was already stale. "B has not replied in five seconds" is knowledge; "B is down" is a decision — and usually the bug.

What guarantee?What does a node know?How does it work?What can fail?How does it fail?Where is coordination?What holds under failure?How does it recover?How would you know?What is the simpler thing?
serializabilitylinearizabilityisolationtransactions

The definitions, stated so they cannot be blurred

Serializability is a transaction isolation property. Take a set of transactions, each of which may read and write many objects. The execution is serializable if its outcome could have been produced by running those transactions one after another in *some* order. Which order? Any order. The definition does not care whether that order matches the order in which the transactions actually happened.

Linearizability is a recency property of individual operations on a single object. It says each operation appears to take effect at a point inside its own interval, and that if operation A finished before operation B started, A's effect point precedes B's. It says nothing about grouping operations into transactions, because it has no concept of a transaction.

Once stated side by side the orthogonality is obvious. One is about *atomicity of groups*; the other is about *ordering against wall-clock reality*. They constrain different things, and a system can satisfy either without the other.

Not linearizableLinearizable
Not serializabletypicalMost default database configurations: read-committed isolation with reads served from a replica. Very common.A linearizable key-value store with no transactions — etcd, ZooKeeper, single-key operations in most distributed KV stores.
SerializableprotocolA serializable database whose reads may be served from a lagging replica, or one that assigns commit timestamps without a real-time constraint. Every transaction is equivalent to some serial order — just not necessarily one matching real time.Strict serializability: transactions are equivalent to a serial order *and* that order respects real time. This is what Spanner-class systems and single-node databases provide.
Two properties, four combinations, all of them real

The anomaly serializability permits and people do not expect

Here is the case that makes the distinction concrete. Transaction T1 commits at 10:00:00, writing x = 1. Transaction T2 begins at 10:00:05, reads x, and returns 0. Is that serializable? Yes — the serial order T2, T1 explains it perfectly. Both transactions are atomic, neither saw a partial state, and the outcome equals a serial execution.

Is it what anyone wanted? No. A user who committed a change five seconds ago and then read it back got the old value, and the database is entirely within its rights. Serializability alone permits an arbitrarily stale but internally coherent view. In practice a single-node database never exhibits this because its natural implementation orders transactions by their real execution, but a distributed one absolutely can, and several do at their "serializable" level.

Conversely, a linearizable store forbids exactly this anomaly for a single key and gives you no atomicity at all across keys. Transferring a balance between two accounts on a linearizable KV store is two separate linearizable operations, and a reader can observe the state between them. Each operation is perfectly ordered; the invariant is still violated.

Serializable, and yet the read misses a transaction that committed firstprotocol
Txn T1Txn T2Storewrite x = 1: deliveredwrite x = 1read x (at an older snapshot): deliveredread x (at an older snapshot)begin (write) at t=1begincommit x = 1 (write) at t=3commit x = 1begin (after T1 committed) (read) at t=6begin (after T1 committed)read x -> 0, commit (read) at t=8read x -> 0, committ=1time →t=8
delivereddelayed (dashed, long)duplicated (×2)dropped — stops short, never arriveswriteread
The serial order T2 then T1 explains this history, so it is serializable. It is not strictly serializable, because T1 completed in real time before T2 began. This is the exact gap the word "strict" closes.

Why the distinction changes what you buy

The practical consequence is that "serializable" and "linearizable" answer different questions, so a requirement must be assigned to the right one. Does my multi-step operation see a coherent state and leave one behind? That is serializability, and no amount of linearizability provides it. Does my read reflect what already finished? That is linearizability, and no amount of serializability guarantees it.

Cost differs too, and not in the direction people assume. Serializability can be provided by a single node with no distributed coordination whatsoever — a laptop's Postgres is serializable. Linearizability in a distributed system requires cross-node communication on every operation. So a serializable-but-not-linearizable distributed database can be substantially cheaper than a linearizable key-value store, despite "serializable" sounding stronger.

The Database domain owns transactions, isolation levels and the anomalies each level permits — see dbLinks transactions-and-acid and isolation-levels. What belongs here is only the boundary: which of the two properties your distributed design actually needs, and the fact that the strongest useful combination is strict serializability, whose price is both the transaction machinery and the cross-node coordination.

  • Need multi-object atomicity → serializability. Linearizability will not give it to you.
  • Need "my read sees what already committed" → linearizability (or strict serializability if transactions are involved).
  • Need both → strict serializability, and expect to pay coordination on every transaction.
  • Snapshot isolation is neither: it is not serializable (write skew survives) and not linearizable (the snapshot may be stale). It is nonetheless the default in many databases.

Key points

  • Serializability: equivalent to *some* serial order of transactions. Real time is not constrained.
  • Linearizability: single operations on a single object, ordered consistently with real time.
  • They are orthogonal. Neither implies the other, and all four combinations exist in shipping systems.
  • Strict serializability is the conjunction, and is what most people mean by either word.
  • Serializability is achievable on one node with no distributed coordination; linearizability in a cluster is not.

The chain, answered

Every field here is required, which is why no lesson in this domain can recommend a design without naming what an operator sees when it fails, what survives the partition, what repairs it afterwards, and the simpler thing to consider first.

How it works
  • Serializability is enforced by a concurrency-control mechanism: two-phase locking, serializable snapshot isolation, or deterministic ordering.
  • The mechanism produces a serialization order — an ordering of transactions the execution is equivalent to.
  • Linearizability is enforced by ensuring every operation observes the effects of all operations that completed before it began, which requires the serving node to rule out a newer state elsewhere.
  • Strict serializability requires the serialization order to also be consistent with real time, which means commit timestamps must be comparable across nodes — the reason systems reach for tightly bounded clocks or a central sequencer.
  • Verification differs: serializability is checked by looking for a cycle in the dependency graph; linearizability is checked by searching for an effect-point placement.
What can fail at the boundary
  • A distributed database assigns commit timestamps without a real-time constraint, producing serializable but stale-looking results.
  • Reads are routed to a replica, so even a serializable engine returns a stale snapshot.
  • A team uses a linearizable key-value store for a multi-key invariant and observes intermediate states.
  • Snapshot isolation is mistaken for serializability and write skew corrupts an invariant that spans rows.
  • Clock uncertainty makes strict serializability unachievable, and the system silently provides serializability instead.
How it fails — what an operator sees
  • Write skew on snapshot isolation: two transactions each check "at least one doctor is on call", each sees two, each removes a different one, and the ward is left uncovered. The operator sees an invariant violation with two clean, committed transactions in the log.
  • Stale read at serializable isolation: a user commits and immediately re-reads through a different connection, getting the previous value. Serializable, correct by the definition, and reported as a data-loss bug.
  • Torn multi-key update on a linearizable KV store: a reader observes the state between two individually-linearizable writes. Observed as a balance that momentarily does not sum, or an item briefly in two lists.
  • Vendor-label mismatch: a system documented as "serializable" turns out to provide snapshot isolation under that name, and the team's invariant depended on the difference. Discovered via corrupted data, not via an error.
  • Coordination-cost surprise: enabling strict serializability across regions raises transaction latency to the inter-region round trip, and throughput collapses because contended transactions now hold their conflicts for that duration.
Where coordination is required
  • Serializability requires coordination between conflicting transactions only — non-conflicting ones proceed independently, which is why it scales better than intuition suggests.
  • Linearizability requires coordination on every operation, including reads, because a read must rule out a newer state anywhere.
  • Strict serializability requires both, plus a way to compare commit times across nodes — a central sequencer, a bounded-uncertainty clock, or a consensus-ordered log. See Total Order Broadcast Is Consensus Wearing a Different Hat.
What still holds under failure
  • A partition makes strict serializability unavailable on the minority side, exactly as linearizability is.
  • Serializability alone can survive a partition on both sides *if* each side handles a disjoint set of data; it cannot if transactions span the divide.
  • Systems commonly degrade from strict serializability to serializability, or from serializable to snapshot isolation, under load or failure — and rarely say so.
How it recovers
  • Detect: test for the specific anomalies rather than trusting the isolation-level name. Write skew and stale-read tests are short and decisive.
  • Contain: if the guarantee degrades under failure, make the degradation explicit and refuse the operations that depend on the stronger level.
  • Recover: no data recovery is needed for a correctly-implemented weaker level; recovery is needed for invariants your application violated while assuming a stronger one.
  • Reconcile: invariant-repair jobs for the specific rules that write skew or stale reads could have broken — the database cannot infer these.
  • Verify: continuous invariant assertions over the data, since they catch level mismatches that documentation review does not.
How you would know
  • The isolation level actually in force per transaction, which is frequently not the one configured at the cluster level.
  • Serialization-failure and retry rates, which are the visible cost of genuine serializability under contention.
  • Whether reads are served at a snapshot and how old that snapshot is.
  • Invariant-violation counters for the specific multi-row rules that snapshot isolation does not protect.
  • Transaction latency broken down by whether cross-region coordination was required.
When it helps
  • Any conversation about what a distributed database provides, where the two words are used interchangeably and should not be.
  • Designing an invariant that spans rows or services, where picking the wrong property means buying the wrong guarantee.
  • Evaluating a vendor claim, since the four-cell matrix is the fastest way to find out what is actually on offer.
When it hurts
  • Single-node systems, which are strictly serializable by construction and where the distinction is academic.
  • Systems with no multi-object invariants, where linearizability per key is the whole requirement and transactions add cost for nothing.
Simpler alternatives

Serializable and linearizable are not two strengths of one thing

Two words that are not two strengths of the same thing
Serializability is about transactions and *some* serial order. Linearizability is about single operations on a single object and *real* time. They are orthogonal, and all four combinations ship.
Serializable, not linearizable
Every execution is equivalent to *some* serial order — but that order is unconstrained by real time, so a read-only transaction may be placed before a transaction that had already committed. A user commits a change, immediately reloads, and sees the old value; the database is behaving exactly as specified. This is the corner that surprises people, and it is where a great many snapshot-based systems actually sit.
SerializabilityLinearizability
UnitprotocolA transaction: a group of operationsOne operation on one object
ConstrainsprotocolEquivalence to some serial orderAn effect point inside the interval, ordered by real time
Real timeprotocolNot constrained at allThe whole point
Achievable on one node?protocolYes — local concurrency control sufficesTrivially, because one node is the real-time order
Achievable in a cluster?assumptionYes, without distributed timeOnly with coordination on every operation
Survives a partition?assumptionOn the side that holds the dataNot on the minority side
What each word constrains — read the two columns as different questions, not as two settings of one dial
A read-only transaction reading a snapshot from before a committed writeprotocol
T1 (write txn) write(x=1) → ack; invoked at 0, responded at 2; no effect point placedT1 (write txn)write(x=1)no effect point placed→ ackT2 (read-only txn) read(x) → 0; invoked at 4, responded at 6; no effect point placedT2 (read-only txn)read(x)no effect point placed→ 0t=0real time →t=6
invocation → response: the op is this whole intervaleffect point — one instant inside the interval
✕ Not linearizable

Search exhausted after 2 states: no placement of effect points inside the operations' intervals produces a legal sequential history that also respects real-time order. The search could never place T2 (read-only txn)'s read: it observed 0 at a point where the register necessarily held 1.

…and yet it is serializable
The serial order T2, T1 explains this execution completely: the read-only transaction ran first and saw x = 0, then the write transaction ran and set x = 1. Nothing in the definition of serializability says that order has to agree with the clock on the wall. Both claims are true at once, which is the entire lesson — “my database is serializable” is not an answer to “does a read see the latest committed write”.
Practical consequence: ask which of the two you actually need, per operation. Most application bugs that people describe as consistency problems are transaction-isolation problems, and are solved by serializability on one node with no distributed anything. The ones that are not — a user who must see their own committed change immediately, a leader lease, a uniqueness claim — need the real-time constraint, and that constraint is what cannot survive a partition.
protocolThe “serializable but not linearizable” cell is demonstrated, not asserted: the register history below is checked by `linearizabilityCheck`, while the serial order that makes it serializable is stated in the panel beside it.

What people believe, and what is true

Claim

Serializable means my read sees the latest committed data.

Reality

It means the outcome matches *some* serial order. A transaction that begins after another committed may still be ordered before it, and returning the old value is permitted. Only "strict" adds the real-time constraint.

Claim

Linearizable means my transactions are safe.

Reality

Linearizability has no concept of a transaction. Two linearizable writes to two keys are two independent operations and a reader can see the state between them.

Claim

Serializable is stronger than linearizable.

Reality

Neither is stronger; they constrain different things. Their conjunction, strict serializability, is stronger than both.

Claim

Snapshot isolation is basically serializable.

Reality

Write skew is permitted under snapshot isolation and forbidden under serializability, and write skew is exactly the anomaly that breaks "at least one of these must remain true" invariants.

Go deeper

Only the levels this lesson can honestly fill — a missing level is a claim nobody had.

Overview

Serializability: transactions look like they ran one at a time, in some order. Linearizability: single operations respect real time. Different properties; strict serializability is both.

Practical

Assign each requirement to the right property. Multi-object atomicity is serializability. "See what already committed" is linearizability. If you need both, you are buying strict serializability and its cross-node coordination on every transaction. And test your database for write skew rather than trusting its isolation-level label.

Advanced

Serializability is checked by finding the dependency graph acyclic; linearizability by finding an effect-point placement. The two verification problems have different shapes because the properties do. Note also that linearizability is *composable* (a system of linearizable objects is linearizable) while serializability is not (composing two serializable systems is generally not serializable), which is precisely why cross-service transactions are hard and why sagas exist. See Atomicity Stops at the Process Boundary and Two-Phase Commit: Buying Atomicity With a Promise.

Apply it

Build it, then break it
  • 🔧 Construct a write-skew scenario for an invariant in your own system, then determine empirically whether your database's default isolation level permits it.
Interview questions
  • 💬 Give a history that is serializable but not linearizable, and one that is linearizable but not serializable.
  • 💬 Your database is at serializable isolation and a user reports reading a stale value moments after committing. Is that a bug?
  • 💬 You have a linearizable key-value store and need to move an item atomically between two lists. What do you actually need?