Skip to content

Strong vs Eventual Consistency Explained

CoreConceptJuly 17, 20268 min read

A user changes their display name, refreshes the page a second later from a phone on a different network, and sees the old name. Nothing crashed. No request failed. The system is working exactly as designed — the design just did not promise that the second read would see the first write.

This guide follows PUT /users/u-42/profile replicated across three regions. We will define what strong consistency (linearizability) and eventual consistency actually guarantee, replicate the write both ways, lose an update to a race the eventually consistent path allows, and choose the model from the read-after-write requirement instead of a vague preference for “strong.”

One spectrum: linearizable order on one end, convergence-only on the other
One spectrum: linearizable order on one end, convergence-only on the other

Consistency is a spectrum, not two boxes

Strong consistency — specifically linearizability — guarantees that every read returns the most recent acknowledged write, and that all clients observe operations in one single, real-time-consistent order. It behaves as if there were only one copy of the data, even though there are several. Eventual consistency guarantees only that if no new writes arrive, replicas will eventually converge on the same value. It makes no promise about how stale a read can be or in what order concurrent writes resolve.

Between those two extremes sit named, checkable models: read-your-writes (a client always sees its own prior writes), monotonic reads (a client never sees an older value after a newer one), and causal consistency (writes that causally depend on each other are seen in that order by everyone). These are not marketing terms — each has a precise guarantee and a mechanism that provides it, and mixing them up is how teams promise more than their database delivers.

This is a different axis from the CAP theorem, which asks what a system does during a network partition. Consistency model choice matters even when the network is healthy, because it decides how fast a replica must catch up before a read is allowed to use it. The database selection guide applies those guarantees to workload and product choices.

PUT /users/u-42/profile must land somewhere on the consistency spectrum
PUT /users/u-42/profile must land somewhere on the consistency spectrum

Quick reference

  • Linearizability: reads always see the latest acknowledged write, in real-time order.
  • Eventual consistency: replicas converge only after writes stop arriving.
  • Read-your-writes, monotonic reads, and causal consistency are distinct, weaker, checkable guarantees.
  • Consistency model is orthogonal to CAP — it applies without a partition too.
  • Pick the guarantee from the read that must not be stale, not from a label on a database homepage.

Remember this

Strong and eventual are the two ends of a spectrum with named, mechanism-backed stops in between — choose the stop your read actually needs.

Strong consistency: one order, enforced by quorum

Linearizable writes to u-42/profile go through a single point of agreement — a leader elected by a consensus protocol such as Raft or Paxos, or a quorum that every read and write must intersect. A write is acknowledged only after a majority of replicas persist it; a read must also reach a majority (or the current leader) so it cannot return a value older than the last acknowledged write. Quorum consistency requires W + R > N, where N is the replica count, W is the number of replicas a write waits for, and R is the number of replicas a read consults.

The cost is latency and availability. Every write waits for a cross-replica round trip, so tail latency rises with the slowest replica in the quorum, and a network partition that strands the leader — or leaves no majority reachable — stops writes rather than serving a possibly stale one. This is the direct trade CAP describes: correctness under partition is purchased with unavailability, not the other way around.

Strong consistency is worth that cost when a stale read causes real harm: account balances, inventory counts that gate checkout, or a leader-election lock. It is not free insurance — using it for data that tolerates staleness (a follower count, a lastSeenAt timestamp) pays the latency tax for a guarantee nothing downstream needs.

Quorum write and read overlap: W plus R exceeding N guarantees the latest value is seen
Quorum write and read overlap: W plus R exceeding N guarantees the latest value is seen

Quick reference

  • Consensus (Raft/Paxos) or quorum overlap gives a single agreed order of writes.
  • W + R > N guarantees every read set intersects the last write set.
  • Latency scales with the slowest replica in the quorum, not the fastest.
  • A lost majority halts writes rather than risking a stale acknowledgment.
  • Reserve it for data whose staleness causes direct harm — locks, balances, gating counts.

Remember this

Strong consistency makes replicas behave like one copy by making every write and read cross a majority — and pays for it in latency and partition-time availability.

Eventual consistency: replicate now, agree later

An eventually consistent write to u-42/profile acknowledges after the local (or single) replica accepts it, then propagates asynchronously to the other regions. The write returns fast because it never waits for a cross-region round trip. The guarantee is weak on purpose: if writes stop, every replica will converge to the same value — but there is no bound on how long convergence takes, and no promise about which value wins when two regions write concurrently.

Conflict resolution has to be explicit. Last-write-wins (LWW) picks the write with the highest timestamp or version and silently discards the other — simple, but it loses data whenever clocks skew or two writes are truly concurrent. Version vectors track which replica saw which prior version, so the system can detect a genuine conflict instead of guessing. CRDTs (conflict-free replicated data types) go further: they pick data structures — counters, sets, registers — whose merge function is provably associative and commutative, so any merge order converges to the same result without a human resolver.

Eventual consistency is the right default for data where staleness is cheap and availability is not: view counts, presence indicators, product recommendations, most of a social feed. It becomes a bug source the moment a client assumes its own write is immediately visible.

Local write acknowledges first; replication and conflict resolution happen after
Local write acknowledges first; replication and conflict resolution happen after

Quick reference

  • Write is acknowledged before other replicas have the value.
  • Convergence is guaranteed only once new writes stop arriving — no time bound by default.
  • LWW is simple and lossy; version vectors detect conflicts instead of hiding them.
  • CRDTs make merges provably order-independent for specific data shapes (counters, sets).
  • Default to eventual consistency where a stale read is cheap and a slow write is not acceptable.

Remember this

Eventual consistency trades a bounded staleness guarantee for write latency and availability — and needs an explicit conflict-resolution rule, not an assumption.

Session guarantees: fixing the common complaint without going strong

Most “eventual consistency is broken” bug reports are actually a missing read-your-writes guarantee — the client's own next read hits a replica that has not received its own prior write. That is fixable without paying for global linearizability: route a client's reads to the replica that served its last write (sticky sessions), or have the client attach the version/timestamp of its last write and have the read replica wait until it has replicated at least that version before answering.

Monotonic reads solves a related complaint — a client seeing a newer value, then an older one, because two reads landed on different replicas with different lag. Pinning a client to one replica for the duration of a session fixes this too, at the cost of that replica becoming a single point of degraded latency for that client.

Causal consistency is the strongest of these practical middle grounds: it guarantees that if write B was made after seeing write A, every client that sees B also sees A first. It requires tracking causal dependencies (typically via vector clocks or hybrid logical clocks) rather than just ordering by wall-clock time — and it is usually enough to make a comment-after-a-post or a reply-to-a-message feel correct without the cost of full linearizability.

Read-your-writes: the client's next read waits for a replica to reach its own write version
Read-your-writes: the client's next read waits for a replica to reach its own write version

Quick reference

  • Read-your-writes: route to the last-written replica, or have reads wait for a minimum version.
  • Monotonic reads: pin a client session to one replica to avoid time-traveling backward.
  • Causal consistency: preserve order for writes that causally depend on each other.
  • None of these require a global consensus round trip on every operation.
  • Set a wait timeout — 'wait for my version' must degrade, not block indefinitely.

Remember this

Most staleness complaints need read-your-writes or causal ordering, not full linearizability — solve the specific guarantee, not the whole spectrum.

Failure story: the profile edit that reverted itself

Trigger. A user in eu-west updates their display name to “Alex.” Two seconds later, on a flaky connection, a stale mobile client retries an older, already-superseded edit — “Alexandra” — that never got acknowledged the first time. Both writes land on different regional replicas within the same second, and the store resolves conflicts with last-write-wins on server receive time. Symptom: the profile settles on “Alexandra,” and the user reports their save “didn't work,” even though it succeeded and was later silently overwritten.

Root mechanism. LWW compares timestamps assigned at each replica's receive time, not at a global, causally ordered clock. The retried request was logically older but arrived later at a replica with laggy clock sync, so it won the timestamp comparison. Nothing errored — the conflict was resolved exactly as designed, just not as the user expected.

Evidence. Both writes exist in the replication log with distinct request IDs and client timestamps; comparing client-side timestamps (not receive time) shows the retried write was causally older. Recovery: replay writes in client-timestamp order for the affected key, or restore from the write-ahead log. Prevention: move conflict detection to version vectors so genuinely concurrent writes surface for resolution instead of silently dropping one, make the mobile client idempotent (dedupe by request ID so a stale retry cannot resubmit), and use hybrid logical clocks instead of raw receive time for ordering.

Failure: a stale retry with an older client timestamp wins last-write-wins on receive time
Failure: a stale retry with an older client timestamp wins last-write-wins on receive time

Quick reference

  • Trigger: a stale client retry races a newer write across regions.
  • Symptom: a successful save silently reverts with no error surfaced.
  • Mechanism: LWW on receive time, not causal/client order, picks the wrong winner.
  • Evidence: compare client timestamps and request IDs across the replication log, not just server receive time.
  • Prevention: version vectors or HLC-based ordering, plus request-ID dedup for retries.

Remember this

Last-write-wins resolves every conflict without ever raising an error — which is exactly why it can silently discard the update the user actually wanted.

Choosing the model from the read, not the vendor label

Start from one question: what breaks if this specific read is stale? If the answer is money, safety, or a gating decision (checkout inventory, a distributed lock, a leader flag), pay for strong consistency on that read path and keep the blast radius small — most systems do not need every table linearizable, only the ones with these properties.

If staleness is cheap but slow writes or write unavailability are not — social counters, presence, recommendations, most denormalized read models — default to eventual consistency, and pick an explicit conflict-resolution strategy (CRDT for pure counters/sets, version vectors when losing data is unacceptable, LWW only when you have accepted that a concurrent write may be silently dropped).

Before reaching for full linearizability to fix a stale-read complaint, check whether the actual complaint is read-your-writes or causal ordering — both are solvable at a fraction of the latency cost. Document the chosen guarantee per data type, not per database, because one storage engine often offers several consistency levels through different read/write options.

Choose from what breaks on a stale read, not a preference for 'strong'
Choose from what breaks on a stale read, not a preference for 'strong'

Quick reference

  • Ask what breaks on a stale read before picking a model — not a general preference for 'strong'.
  • Scope strong consistency to the specific fields/keys that need it.
  • Default to eventual consistency with an explicit, named conflict-resolution rule.
  • Try read-your-writes or causal consistency before paying for global linearizability.
  • Document the guarantee per data type — most databases offer more than one per-query.

Remember this

Choose consistency per read path from the cost of staleness, not from a database's marketing tier — and reach for session guarantees before full linearizability.

Key takeaway

Strong consistency makes replicas behave like one copy by routing every read and write through a majority or a leader, and it charges latency and partition-time availability for that guarantee. Eventual consistency skips that toll and only promises convergence once writes stop, which means conflict resolution — LWW, version vectors, or CRDTs — is not optional, it is the mechanism that decides whose write survives. Read-your-writes, monotonic reads, and causal consistency solve most real complaints in between without paying for full linearizability.

Practice (30 minutes): take one write path in a system you know. Write down what breaks if a read right after that write is stale by 2 seconds. If nothing breaks, confirm the store's default consistency level and its conflict-resolution rule for concurrent writes to the same key. If something breaks, implement read-your-writes with a version token (like the snippet above) before reaching for a quorum write, and write a test that races two concurrent updates to prove which one your resolution rule keeps.

Share:

Related Articles

A shopping cart write to cart-77 needs to land on enough replicas that a later read is guaranteed to see it — but "enoug

Read

The CAP theorem states that when a distributed system is partitioned, it cannot guarantee both linearizable consistency

Read

An order-ingestion API writes to an in-memory queue, a worker pool drains it, and a payment provider on the other end ge

Read

Keep learning

Follow a structured path or browse all courses to go deeper.