CAP Is Not “Pick Two of Three”, and It Describes the Rare Case

The famous framing is wrong twice over. Partition tolerance was never something you choose, and the trade-off only exists while a partition is happening. Which means CAP is silent about the decision you actually make every day, and PACELC is the version that names it.

Tech Talk News Editorial9 min read
ShareXLinkedInRedditEmail
CAP Is Not “Pick Two of Three”, and It Describes the Rare Case

Key takeaways

  • The "pick two of three" framing is an oversimplification: Eric Brewer clarified in 2012 that the choice between consistency and availability only applies during a network partition, and a healthy network can deliver all three.
  • Partition tolerance is not a property you select, because networks fail whether or not you planned for it, so the only real question is what your system does when a partition occurs.
  • Brewer also noted that all three properties are continuous rather than binary: availability ranges from 0 to 100 percent, consistency has many levels, and even partitions have nuances.
  • PACELC, proposed by Daniel Abadi in 2010, adds the trade-off CAP omits: if there is a Partition, choose Availability or Consistency, Else choose Latency or Consistency.
  • The else branch is the one that matters day to day, because partitions are the exception and normal operation is the rule, so latency versus consistency is the choice engineers make constantly while CAP says nothing about it.

The CAP theorem is the most-repeated and most-mangled idea in distributed systems. The version everyone learns is “consistency, availability, partition tolerance: pick two.”

That is wrong in two separate ways, and the author of the theorem said so himself.

Not optional
Partition tolerance, in any real system
During P only
When the C-versus-A choice actually binds
Continuous
All three properties, per Brewer 2012
Else branch
PACELC's latency-vs-consistency, your daily trade

Wrong the First Way: You Do Not Choose P

Partition tolerance is not a feature you enable. A partition is two parts of your system being unable to talk to each other, and that happens because a cable failed, a switch rebooted, a security group changed, or a cloud provider had a bad afternoon.

You do not opt out of that. It happens to you.

So when someone describes a system as “CA”, choosing consistency and availability while forgoing partition tolerance, they are describing either a single machine, which is not a distributed system, or a distributed system that will fail in an undefined way the first time a network hiccups. There is no third reading. The only genuine question is what happens once a partition has occurred.

Wrong the Second Way: The Trade-off Is Not Permanent

This is the correction Eric Brewer published in 2012, and it is the one that changes how the theorem is useful. The choice between consistency and availability only applies while a partition is happening. When the network is healthy, a system can deliver all three.[1]

Reread the popular framing with that in mind and it collapses. It is not a standing architectural allegiance. It is a decision about behaviour during an exceptional condition, and it can even be made differently for different operations inside the same system.

Brewer added a second correction in the same paper, which gets quoted even less: all three properties are continuous rather than binary. Availability is obviously continuous from 0 to 100 percent. Consistency has many distinct levels. Even partitions have nuances.[1] Real systems sit somewhere on a surface, not at one of three corners of a triangle, and the triangle diagram is most of why people think otherwise.

It is not an allegiance you declare. It is a decision about what to do during an outage, and you can make it differently per operation.

What the Choice Actually Looks Like

A partition splits your database into two halves that cannot reach each other. A write arrives at one half. You have exactly two options and there is no clever third.

Stay consistent. Refuse the write, because you cannot confirm the other half agrees. The caller gets an error. Nothing incorrect is ever stored, and you have chosen consistency by sacrificing availability.

Stay available. Accept the write locally and reconcile later. The caller succeeds. For a period the two halves disagree, and somebody has to define what happens if both halves accepted conflicting writes to the same record.

Which is correct depends entirely on what the data is. A balance transfer should refuse: two halves independently approving withdrawals from one account is exactly the failure that must not happen. A like on a post should accept: a count briefly disagreeing across regions is not a problem worth an outage.

Why this matters

The practical consequence is that this is a per-operationdecision, not a per-database one. The same application can reasonably demand strict consistency on payments and accept eventual consistency on view counts. Modern databases increasingly let you choose per query, which makes “is Postgres CP or AP” the wrong shape of question.

PACELC, Which Describes Your Actual Tuesday

Here is the part I wish had replaced CAP in the curriculum. Daniel Abadi proposed PACELC in 2010, and it reads as one sentence:[2]

If there is a Partition (P), choose between Availability (A) and Consistency (C). Else (E), choose between Latency (L) and Consistency (C).

The first half is CAP. The second half is the one CAP never addressed, and it is the trade-off engineers live with every single day, because partitions are the exception and normal operation is the rule.[2]

The else branch is concrete. To keep replicas strictly consistent, a write must be acknowledged by other nodes before you confirm it, and those acknowledgements cost round trips. Cross-region, that is tens of milliseconds you cannot optimise away, because it is bounded by distance and the speed of light rather than by your code, which is the same wall described in latency versus bandwidth.

So every day, on every write, in a system with no partition and nothing wrong, you are choosing: wait for the quorum and be slower, or acknowledge locally and be briefly inconsistent. That is the decision that shapes user experience. CAP is silent about it.

Why the Wrong Version Persists

Partly the triangle diagram, which is a genuinely bad piece of information design: it implies three symmetric options and a free choice among them, when one vertex is compulsory and the trade only exists in a rare state.

Partly because “pick two” is memorable and correct-sounding, and the accurate version needs two sentences and a conditional.

And partly because it became an interview question, which rewards reciting the received framing rather than the corrected one. If you are ever asked, the answer that demonstrates you have actually read about this is: P is not optional, the C-versus-A choice binds only during a partition, and the trade-off that matters in normal operation is latency versus consistency.

Takeaway

Partition tolerance is not a choice, it is a fact about networks. The consistency-versus-availability decision only binds while a partition is happening, it is made per operation rather than per system, and all three properties are continuous rather than binary. For the other 99% of the time, the real trade-off is PACELC's else branch: how much latency you will accept to keep replicas consistent. That is the one you are actually making today.

Where this becomes an architecture decision rather than a definition is in database architecture patterns and SQL versus NoSQL, and the reason you inherit the problem at all is usually a boundary you chose, which is monolith versus microservices.

Sources and further reading

  1. 1.PrimaryEric Brewer, "CAP Twelve Years Later: How the Rules Have Changed". The author of the theorem correcting the popular reading: the choice applies only during a partition, and all three properties are continuous rather than binary.
  2. 2.Reporting"Beyond the CAP theorem: what PACELC tells us that CAP never could". Source for the PACELC formulation and the point that the else branch, latency versus consistency in normal operation, is the trade-off engineers face daily.
  3. 3.PrimaryDaniel Abadi, "IEEE Computer issue on the CAP Theorem". Abadi, who proposed PACELC, on the same IEEE issue in which Brewer published his revision.

Frequently asked questions

What is the CAP theorem?
It states that a distributed data store cannot simultaneously guarantee consistency, availability and partition tolerance. The useful reading is narrower than the famous one: when a network partition occurs, a system must choose between remaining consistent and remaining available, because it cannot do both while nodes are unable to reach each other.
Is the CAP theorem really about picking two of three?
No, and Eric Brewer said so himself in 2012. The trade-off only binds during a partition; when the network is healthy a system can provide consistency and availability at once. Presenting it as a permanent choice among three options implies designs that do not exist, such as a distributed system that has opted out of partitions.
Why is partition tolerance not optional?
Because a partition is something that happens to you rather than something you enable. Cables fail, switches reboot, and packets are dropped regardless of your architecture, so a distributed system does not get to decline partition tolerance. What it gets to decide is how it behaves once a partition has already occurred.
What is PACELC?
An extension of CAP proposed by Daniel Abadi in 2010, read as one sentence: if there is a Partition, choose between Availability and Consistency, Else choose between Latency and Consistency. It adds the normal-operation trade-off that CAP leaves out entirely.
Why does PACELC matter more than CAP in practice?
Because partitions are rare and normal operation is constant, so the branch you live in almost all the time is the else branch, where the real choice is how much latency you will accept to keep replicas consistent. CAP describes the exception; PACELC describes an ordinary Tuesday.
Are consistency and availability all-or-nothing?
No, and treating them as binary is part of what makes the classic framing misleading. Brewer pointed out that availability is obviously continuous from 0 to 100 percent, that there are many distinct levels of consistency, and that even partitions have nuances, so real designs sit somewhere on a surface rather than at one of three corners.

Written by

Tech Talk News Editorial

Computer engineering background. Writes about software, AI, markets, and real estate, and the places where the three meet.

More about the author
ShareXLinkedInRedditEmail