Eventual Consistency and Consistency Models

Imagine a shopping cart replicated across data centers in Virginia, Ireland, and Tokyo. A customer in Tokyo adds a laptop. Then she immediately refreshes the page. Suppose the Tokyo replica has not yet heard about a write from a session routed to Virginia. Does the customer see an empty cart? Whether that outcome is a bug or an acceptable tradeoff depends entirely on the consistency model the system promises. It does not depend on some vague notion of correctness. Consistency models turn the fuzzy question "does replication work?" into a precise contract. That contract exists between a distributed system and its clients. This matters because every large-scale replicated system must answer the same question. This includes replicated databases, caches, message queues, and CRDetermined data structures. The CAP Theorem forces this question upon all of them: when a network partition or high latency makes it expensive to keep replicas perfectly synchronized, what guarantee do we keep, and what do we relax? There is no single right answer. Banks and inventory systems often need strong guarantees. Social media feeds and DNS tolerate staleness for the sake of availability and low latency. The engineering skill is knowing the spectrum of models. This spectrum runs between "as if there is only one copy of the data" and "replicas agree eventually, given enough time and no new writes." The skill lies in picking the point on that spectrum that matches the application's real requirements. This article builds that spectrum systematically. We start from linearizability, the strongest and most intuitive model. We then walk down through sequential consistency, causal consistency, and session-level guarantees. These include read-your-writes and monotonic reads. We end at plain eventual consistency. For each model we give a precise definition and a mechanism that implements it. We also describe the cost it avoids or incurs relative to its stronger neighbors. We also work a full trace of a replicated key-value store under different models. This makes the abstract definitions become concrete operational behavior. By the end, you should be able to look at a system's documentation. Phrases like "strong consistency for single-key reads," "causal consistency across regions," or "eventually consistent replicas" should become clear. You should know exactly what client-observable behavior each phrase permits and forbids. You should also know what latency and availability price the system paid to get there. This foundation feeds directly into understanding NoSQL data models. It also supports understanding the consistency choices made inside stream processing systems.

Key takeaways
  • Consistency models specify what values reads may legally return given a history of writes across replicas — they are contracts, not implementation details.
  • Linearizability (strong consistency) makes a replicated system behave like a single copy with real-time ordering; it is the strongest practical model but costs latency and, under partition, availability (per CAP).
  • Sequential consistency relaxes real-time ordering but keeps a single global operation order agreed on by all processes.
  • Causal consistency only orders operations that are causally related (via happens-before), letting concurrent operations be seen in different orders at different replicas — it is the strongest model still achievable under partition (per the CAP/PACELC tradeoff).
  • Session guarantees — read-your-writes, monotonic reads, monotonic writes, writes-follow-reads — are practical, cheap-to-implement contracts a single client can rely on even under weaker global models.
  • Eventual consistency only promises convergence: if writes stop, all replicas eventually agree; it says nothing about what a read sees in the meantime, making it the most available but least predictable model.
The core insight

A consistency model is a promise about which histories of reads and writes a distributed system will allow a client to observe — stronger promises cost latency and availability, weaker ones cost predictability.

The idea

A consistency model is a contract between a data store and its clients that constrains the set of legal orderings in which operations (reads and writes, possibly on multiple replicas) may appear to take effect. Formally, given a history — the set of all invoke/return events for operations issued by clients — a consistency model defines which histories are admissible. A replicated system satisfies a model if every history it can produce is admissible under that model. This framing matters because "the database returned the wrong value" is meaningless without first fixing what values were allowed. Consistency models form a partial order by strength: model A is stronger than B if every history satisfying A also satisfies B (A's guarantee implies B's). At the top sits linearizability: every operation appears to take effect atomically at some point between its invocation and response, consistent with real (wall-clock) time, and all replicas agree on this single order. This is the most intuitive model — it behaves exactly like an unreplicated, single-threaded data store — and the strongest one commonly implemented. Just below it, sequential consistency drops the real-time constraint: all processes still agree on one global order of operations, and each process's own operations appear in the order it issued them, but that global order need not respect true invocation/return timing across processes. Weaker still, causal consistency only requires that operations related by a happens-before relationship (one causally influencing another, e.g., a read that observes a write, or two writes by the same process) are seen in that order everywhere; operations with no causal relationship — concurrent operations — may be observed in different orders by different replicas. Below the "total order" family lie session guarantees, which constrain what a single client's own session observes, regardless of what other clients see. The four classical session guarantees are: read-your-writes (a client always sees its own prior writes), monotonic reads (once a client sees a value, it never sees an older one), monotonic writes (a client's writes are applied in the order it issued them), and writes-follow-reads (a client's writes are ordered after any writes it has previously read, preserving the causal chain it observed). At the very bottom of the spectrum is eventual consistency: the only guarantee is that if updates stop arriving, all replicas will eventually converge to the same state. It says nothing about ordering, staleness bounds, or what any given read returns while writes are still in flight — it is a liveness property, not a safety property, and is deliberately the weakest useful guarantee a replicated store can offer.

How it works

Each model is realized by a different replication and read/write protocol. We describe mechanisms for the key points on the spectrum, then give unified pseudocode for a replicated key-value store parameterized by consistency level, which is how many real systems (e.g., quorum-based stores) actually implement the spectrum.

Linearizability is typically implemented via a single leader/primary that serializes all writes (and often all reads), or via a consensus protocol (e.g., Paxos/Raft) that agrees on a total order of operations, combined with synchronous replication acknowledgment before a write is considered committed. A read must go to the current leader or a quorum guaranteed to include the latest write.

Sequential consistency can be implemented with a single serializing point (like linearizability) but without requiring that this order respect real-time — for instance, all replicas apply a global log of writes in the same order, but a client might read a replica that has processed the log up to an earlier point, as long as that client never observes operations out of the agreed order relative to its own issued operations. In practice, sequential consistency is rarely implemented standalone; it's more often a theoretical middle rung.

Causal consistency attaches metadata — typically vector clocks or dependency-tracking version vectors — to every write, capturing which prior writes it causally depends on. A replica only applies (makes visible) an incoming write once all the writes it depends on have already been applied locally. This guarantees causal order without requiring a global serializing bottleneck, so causally unrelated writes from different replicas can be delivered in different orders at different sites without violating the model.

Session guarantees are implemented at the client or session-proxy level using version tracking. A client remembers the highest write-version (or vector-clock timestamp) it has produced or observed, and every subsequent read is routed to (or blocked at) a replica until that replica has caught up to at least that version.

Eventual consistency requires only an anti-entropy mechanism — a background process (e.g., gossip, read-repair, or Merkle-tree comparison) that ensures replicas exchange missed updates and reconcile diverging states (often via last-write-wins timestamps or CRDT merge functions) so that, absent new writes, all replicas converge. The following pseudocode shows a generic quorum-based replicated store, the workhorse mechanism behind systems like Dynamo-style databases, and how tuning quorum sizes and version metadata moves the system along the consistency spectrum. ``` // N = number of replicas, W = write quorum size, R = read quorum size // Each value stored with a vector clock (or scalar timestamp for LWW) function WRITE(key, value, client_context): new_version = client_context.clock new_version[this_client] += 1 write_op = (key, value, new_version) acked = 0 for replica in select_replicas(key, N): send write_op to replica asynchronously wait until acked >= W // synchronous acknowledgment threshold client_context.clock = merge(client_context.clock, new_version) return SUCCESS function READ(key, client_context): responses = [] for replica in select_replicas(key, N): send read(key) to replica wait until len(responses) >= R candidates = responses received so far // Reconcile concurrent versions using vector clock comparison latest = causally_maximal(candidates) // may be a set if concurrent if len(latest) > 1: resolved = application_merge(latest) // e.g., CRDT merge, or app callback else: resolved = latest[0] client_context.clock = merge(client_context.clock, resolved.version) // Session guarantee: reject replicas that haven't caught up if session_mode == READ_YOUR_WRITES: assert resolved.version dominates client_context.last_write_version return resolved.value function ANTI_ENTROPY_BACKGROUND(): loop forever: for each pair of replicas (A, B): diff = compare_merkle_trees(A, B) for key in diff: exchange_and_merge(A, B, key) // reconciles divergent state sleep(interval) ``` Tuning the quorum sizes reproduces the spectrum directly:

  • W = N, R = 1 or W = 1, R = N: every read or every write touches all replicas, giving strong (often linearizable, with proper fencing) guarantees at maximal latency cost.
  • W + R > N: guarantees that read and write quorums overlap in at least one replica, so every read quorum includes the most recent write — this yields strong consistency for individual key operations (sometimes called "quorum consistency") without needing all N replicas to respond.
  • W + R ≤ N: quorums may not overlap; a read can miss the latest write entirely. The system falls back to eventual consistency, relying on the anti-entropy process to converge replicas over time.

Session guarantees are layered on top by having `client_context` carry the client's own write/read history and refusing to serve a replica that hasn't caught up — this is what the `assert` in `READ` enforces for read-your-writes; monotonic reads are enforced analogously by comparing against the client's last-seen version rather than last-written version.

Figure
The consistency spectrum: guarantee strength versus availability/latency cost
Consistency Spectrum Strong Eventual weaker guarantee, higher availability → Linearizable real-time total order Sequential total order, no real-time Causal happens-before order only Session RYW / monotonic reads/writes Eventual converge if writes stop high latency, low availability low latency, high availability

Complexity & correctness

Cost of stronger guarantees. Linearizability's cost is fundamentally a latency and availability tax, formalized by the CAP theorem and refined by PACELC: even absent a partition, a linearizable system must wait for enough replicas (or the current leader) to acknowledge before returning, adding at least one network round-trip's worth of latency proportional to the number of replicas needed for a majority/quorum. Under a partition that isolates a replica from the majority, that replica must refuse operations (become unavailable) rather than risk violating the single-order guarantee — this is precisely the C-vs-A tradeoff CAP describes. Formally, achieving linearizability for a single register requires, in the worst case, at least one message delay proportional to network round-trip time between the coordinating node and a quorum; the FLP impossibility result additionally shows no deterministic asynchronous consensus protocol can guarantee termination if even one process may fail, meaning practical consensus systems (Raft, Paxos) trade guaranteed termination for randomized/timeout-based liveness in adversarial conditions.

Cost of the quorum mechanism. For the quorum-based `READ`/`WRITE` pseudocode: writes cost `O(1)` messages per replica contacted, i.e., `O(N)` total messages but only latency proportional to the slowest of the W fastest acknowledgments, not all N. Reads are symmetric, with latency proportional to the slowest of the R fastest responses. The correctness invariant that gives quorum systems their strength is:

W+R>N  ⟹  every read quorum and every write quorum intersect in at least one replica.W + R > N \implies \text{every read quorum and every write quorum intersect in at least one replica.}

Proof sketch: by the pigeonhole principle, if a write quorum of size W and a read quorum of size R are both subsets of N replicas and W + R > N, then |write quorum ∩ read quorum| ≥ W + R − N > 0, so they must share at least one common replica. That shared replica has seen the most recent committed write, so any read quorum is guaranteed to observe the latest value (or a version at least as new, resolved via vector-clock comparison) — this is the mechanism underlying "quorum consistency," which approximates linearizability for single-key operations when combined with proper version/timestamp reconciliation, though true linearizability additionally requires handling concurrent writes and real-time ordering across overlapping operations, which naive quorums alone do not guarantee.

Causal consistency's correctness argument. The invariant enforced is: a write `w2` is delivered (made visible) at a replica only after every write `w1` such that `w1 → w2` (w1 happens-before w2) has already been delivered there. Since happens-before is defined transitively and is captured exactly by vector-clock dominance (`w1`'s vector clock is component-wise ≤ `w2`'s, with at least one strict inequality), checking "has this replica applied all of w2's dependencies" reduces to comparing vector clocks component-wise, an `O(N)` operation per delivered write where N is the number of replicas/processes tracked. This gives a clean proof that causal consistency is achievable despite network partitions (it does not require any cross-partition communication to apply causally-independent writes), which is exactly why it sits at the strongest point on the spectrum still compatible with full availability under partition — a result formalized in work distinguishing CAP-available consistency models.

Eventual consistency's convergence guarantee. The correctness claim — "if writes stop, replicas converge" — relies on the anti-entropy process visiting every pair of replicas infinitely often (a fairness assumption) and on the merge function being commutative, associative, and idempotent (the defining properties of a CRDT merge or of last-write-wins with a total order on timestamps). Under these conditions convergence follows because repeated pairwise merges of a commutative-associative-idempotent operation over a finite set of updates is guaranteed to reach a fixed point equal to the "merge of all updates" regardless of the order pairs are processed in — this is precisely the algebraic structure of a join-semilattice, and eventual consistency's convergence is a corollary of the semilattice's least-upper-bound property. The tradeoff: this says nothing about when convergence happens or what stale value a read might see beforehand, so eventual consistency provides no bound on staleness without additional engineering (e.g., bounded staleness models).

Honest tradeoff summary: every step down the spectrum trades a provable, client-visible guarantee for lower latency and higher availability, and the choice is not free in either direction — over-provisioning strong consistency where it isn't needed wastes latency budget and availability margin; under-provisioning it produces subtle bugs (lost updates, stale reads, causality violations) that are notoriously hard to reproduce and debug because they only manifest under specific network timing.

Worked example

Consider a 3-replica key-value store (replicas A, B, C) holding key `"cart"`, with N = 3. We trace three scenarios for the same sequence of client actions under different consistency configurations.

Sequence of events (wall-clock order): 1. Client X writes `cart = [laptop]` (from Tokyo, nearest replica C). 2. Client X immediately reads `cart` (routed to replica A, in Virginia). 3. Client Y (independent session) reads `cart` (routed to replica B, Ireland).

StepModel: Linearizable (W=3,R=1 with fencing / leader-based)Model: Quorum (W=2,R=2, N=3)Model: Plain eventual (W=1,R=1, async replication)
1. X writes `[laptop]`Write blocks until all 3 replicas ack (or leader commits + replicates synchronously). Returns after ~cross-region RTT to slowest replica.Write blocks until 2 of 3 replicas ack. Returns after ~RTT to 2nd-fastest replica (C and, say, A).Write acknowledged as soon as replica C alone stores it. Returns almost immediately; B and A not yet updated.
2. X reads on AA already has the write (step 1 required all 3). Returns `[laptop]`.A has it (A was in the W=2 set). Returns `[laptop]`.A has not received the async update yet. Returns `[]` (empty) — read-your-writes is violated unless a session token forces X's read to replica C or waits for A to catch up.
3. Y reads on BB has the write. Returns `[laptop]`.Read quorum R=2 must contact 2 replicas; if it contacts {B, C}, C's response dominates B's, resolved to `[laptop]`. If it contacted only B directly with R=1 by misconfiguration, it could see stale data — this is exactly why W+R>N matters.B has not received the update via anti-entropy yet. Returns `[]`. Eventually, gossip/anti-entropy propagates the write to A and B, and after that point, all further reads return `[laptop]` — this is the "eventual" convergence, but Y's read at this instant is legitimately stale under the model's own contract.

What changes with causal consistency specifically: suppose instead client Y's read in step 3 is causally dependent on X's write — e.g., X sent Y a message "I just added the laptop, check the cart," which under the model's happens-before tracking attaches X's write's vector clock to that message. A causally consistent system guarantees that once Y receives that message and then reads `cart`, Y's read will be routed only to a replica that has already applied X's write (or Y's read will block until it has), even though Y and X are on different replicas. This is strictly stronger than plain eventual consistency (which permits Y to see `[]` indefinitely until anti-entropy happens to run) but weaker than full quorum/linearizable consistency (which would also order Y's read correctly relative to any other client's writes, not just ones Y is causally aware of). The vector-clock check in the `READ` pseudocode (`resolved.version dominates client_context.last_write_version`) is exactly the mechanism enforcing this in step 2 for read-your-writes, and an analogous check against `last_read_version` from a causally-linked message would enforce it in step 3.

Numeric quorum check: with N = 3, W = 2, R = 2, we have W + R = 4 > N = 3, satisfying the intersection invariant — any write quorum {two of A,B,C} and any read quorum {two of A,B,C} must share at least one replica, by pigeonhole (2 + 2 − 3 = 1 guaranteed overlap). With W = 1, R = 1 (the plain-eventual configuration), W + R = 2 ≤ N = 3, so quorums can be fully disjoint (e.g., write quorum {C}, read quorum {A}), exactly reproducing the stale read observed in step 2 of the eventual-consistency column above.

Common pitfalls & traps

PitfallWhy it happensConsequence
Assuming "eventual consistency" bounds stalenessThe model only promises convergence if writes stop; under continuous writes there is no guaranteed bound on how stale a read can be.Applications silently serve arbitrarily old data during sustained write load, breaking assumptions like "the price shown is recent."
Confusing sequential consistency with linearizabilityBoth give a single global total order; only linearizability additionally respects real-time invocation order.A client can observe a write "before" it was issued in real time under sequential consistency, breaking real-time reasoning (e.g., "I just paid, why does the balance still look old, even on the terminal I paid at").
Treating causal consistency as equivalent to "happens after in real time"Causal order only tracks explicit happens-before chains (same-process order, message passing, read-then-write); it does not order operations with no causal link.Two genuinely unrelated concurrent writes can be applied in different orders at different replicas — surprising if a developer expects a single global timeline.
Ignoring session guarantees when routing reads to arbitrary replicas via a load balancerLoad balancers optimize for latency/load, not for "did this replica see the client's last write."Classic read-your-writes violation: a user edits their profile, refreshes, and sees the old data because the read landed on a lagging replica.
Assuming W + R > N alone gives full linearizabilityThe overlap guarantees a read sees some write no older than the last completed one, but does not by itself resolve concurrent writes or real-time ordering across overlapping operations.Subtle lost-update or "read sees a value older than one this same client already wrote" bugs when clients don't carry version context.
Using last-write-wins timestamps without synchronized clocksLWW conflict resolution assumes timestamps totally order writes correctly.Clock skew between replicas can cause an earlier real-world write to "win" over a later one, silently discarding legitimate updates.

Pioneers & history

The theory of consistency models grew out of work on shared-memory multiprocessors and later distributed databases, formalizing intuitions programmers already had about "what a memory read should return."

Origins · 1 minLeslie Lamport and how this was discovered
LL
Leslie Lamport
1941–present · Formalized sequential consistency and the happens-before relation, foundational to nearly every distributed consistency model since

Lamport's 1978 paper "Time, Clocks, and the Ordering of Events in a Distributed System" introduced the happens-before partial order and logical (Lamport) clocks, giving the mathematical vocabulary later used to define causal consistency precisely. His 1979 paper defined sequential consistency for multiprocessor memory. He later designed the Paxos consensus protocol, the theoretical backbone of most modern linearizable replicated systems, and received the 2013 Turing Award for these and related contributions to distributed computing.

History
1978
— Lamport introduces happens-before and logical clocks for distributed event ordering.
1979
— Lamport formally defines sequential consistency for shared-memory multiprocessors.
1990
— Herlihy and Wing define linearizability as a correctness condition for concurrent objects.
1997
— Terry, Demers, et al. (Bayou project) formalize session guarantees: read-your-writes, monotonic reads, monotonic writes, writes-follow-reads.
2007
— Amazon's Dynamo paper popularizes quorum-based eventual consistency and vector clocks in industrial key-value stores.

Mustaque Ahamad and colleagues formalized causal consistency and causal memory in the early-to-mid 1990s, giving a precise semantics to "operations respect happens-before but not real time." Werner Vogels, as Amazon's CTO, was instrumental in popularizing eventual consistency as an explicit, named engineering tradeoff rather than an implicit bug, through the Dynamo system and subsequent writing. The tension these pioneers formalized — strong guarantees versus availability under partition — was later crystallized by Eric Brewer's CAP theorem (conjectured 2000, proven by Gilbert and Lynch in 2002) and refined by Daniel Abadi's PACELC framework, which observes that even without a partition, systems must still trade latency for consistency.

Where this matters

Distributed SQL and NewSQL systems (Google Spanner, CockroachDB) implement linearizable or externally-consistent transactions using synchronized clocks (TrueTime) or hybrid logical clocks combined with consensus (Paxos/Raft), targeting applications like financial ledgers where strong consistency is worth its latency cost. Dynamo-style NoSQL stores (Amazon DynamoDB's original design, Apache Cassandra, Riak) expose tunable consistency via quorum parameters (W, R, N), letting application developers choose per-operation where on the spectrum they sit — this tunability is a direct ancestor of the ideas explored further in NoSQL Data Models Overview. Session-guarantee mechanisms appear in practice as "read-your-writes" tokens passed between a web client and a load balancer (e.g., MongoDB's causal consistency sessions, or sticky-session routing in many web frameworks) so a user never sees their own edit "disappear" after a page refresh. CRDTs (Conflict-free Replicated Data Types), used in collaborative editors (Google Docs-style operational transforms, Figma's multiplayer engine) and distributed caches, are a direct engineering application of the join-semilattice merge property that makes eventual consistency provably convergent. Caching layers and CDNs (DNS, HTTP caches, CDN edge nodes) are classic eventually-consistent systems: a DNS record update propagates over the TTL period, and clients may see stale records for that window — an explicit, accepted tradeoff for the enormous availability and latency benefits of globally distributed caching. Stream processing systems, which must reason about event ordering and watermarking across distributed operators, inherit these same ordering questions in a different guise, foreshadowing the material in Stream Processing Systems, where "consistency" becomes a question about ordering and completeness of event streams rather than replica state.

Ask the tutor: How would you redesign the quorum parameters (N, W, R) for a banking ledger versus a social media "likes" counter, and why?

Is eventual consistency the same as "the system is broken until it catches up"?

No — it is a deliberate, well-defined design choice, not a defect. The model explicitly trades a strong ordering guarantee for lower latency and higher availability, particularly under network partitions where the CAP Theorem shows you cannot have both strong consistency and availability. Systems like DNS, many CDNs, and shopping-cart-style NoSQL stores choose eventual consistency because most operations tolerate brief staleness far better than they tolerate downtime or high latency. The key is that engineers must know they're in an eventually-consistent regime and design the application logic (idempotent operations, conflict resolution, user-facing messaging) around that fact rather than assuming stronger guarantees implicitly.

Why would anyone choose sequential consistency over linearizability if it's weaker?

In practice, few systems implement pure sequential consistency as their headline guarantee — it's more useful as a theoretical stepping stone that clarifies exactly what real-time ordering buys you beyond a single agreed total order. Some multiprocessor memory models and certain replicated logs are naturally sequentially consistent because they serialize a global operation log without needing to synchronize that log's positions to wall-clock time, which can be cheaper than full linearizability's real-time constraints. The main lesson from sequential consistency is diagnostic: it isolates real-time ordering as the specific, expensive ingredient that linearizability adds on top of "just agree on some total order."

How do vector clocks actually detect that two writes are concurrent rather than causally ordered?

A vector clock is an array with one counter per replica/process; a process increments its own counter on each event and attaches its current vector to every message or write. Given two vectors V1 and V2, if every component of V1 is less than or equal to the corresponding component of V2 (with at least one strictly less), then V1 happened-before V2. If neither vector dominates the other — some components are larger in V1 and others larger in V2 — the two events are concurrent, meaning no causal chain connects them, and a causally consistent system is permitted to deliver them in either order at different replicas.

Do session guarantees require a centralized coordinator to track a client's history?

No — the standard implementation is fully client-side or proxy-side: the client (or a thin session-tracking layer) simply remembers the version, vector-clock timestamp, or write-token of its most recent relevant operation and attaches it to subsequent requests. The replica serving a request checks that its local state dominates that token before answering (or waits/redirects until it does). This keeps session guarantees cheap and horizontally scalable, since no global coordination point is needed — only a small amount of metadata carried by the client itself, which is why systems like MongoDB and DynamoDB can offer session-scoped guarantees without sacrificing the scalability benefits of full replication.

How does PACELC extend the CAP theorem's relevance to consistency models?

CAP describes the tradeoff only during a network partition: choose consistency or availability. PACELC (Abadi, 2010) observes that even without any partition (the "Else" case), a system must still trade Latency against Consistency (the "LC" part), because achieving stronger consistency requires more coordination round-trips regardless of whether the network is currently partitioned. This explains why even a healthy, fully connected replicated system pays a latency cost for linearizability — the tradeoff embedded in the consistency spectrum isn't purely a partition-response strategy, it's a constant architectural tension present in every request.

Can a system offer different consistency levels for different operations simultaneously?

Yes, and this is standard practice in quorum-based NoSQL systems: a single database can serve one request with W=1, R=1 (fast, eventually consistent) and another request on the same table with W=N, R=N or W+R>N (strong, quorum-consistent), chosen per-query by the application depending on how critical that particular read or write is. This tunability is one of the main practical advantages of the Dynamo-style architecture over a monolithic "always strongly consistent" or "always eventually consistent" design, and it directly foreshadows the flexible consistency knobs found across modern NoSQL systems.

Why is causal consistency described as "the strongest model achievable without sacrificing availability under partition"?

This is a proven result: models stronger than causal consistency (sequential, linearizable) require some operations to see a total order across all replicas, which in general requires cross-partition communication to resolve — exactly what a partition prevents, forcing either blocking (unavailability) or violation of the guarantee. Causal consistency only requires ordering causally related operations, and causally independent operations, by definition, involve no dependency that would require cross-partition coordination to resolve safely. This lets each partition continue serving requests for causally independent data during a network split while still respecting every genuine causal dependency, which is why it's often called the strongest "always-available" consistency model.

Before this

Where this leads