Consistency is a complex attribute of a system, and the need for it varies depending on the system in question. It is very frequently misunderstood, so let’s first look at what we mean by consistency before we examine ways to control it.
A system can be said to be consistent if different pieces of related data throughout the system are in agreement with one another about the state of the world.
For a simple example, if I calculate the total amount of deposits I’ve made to a bank account as well as the total number of withdrawals, the system would be consistent if it reports a bank balance that agrees with the delta between these two numbers.
On a classic single-processor, single-memory-space von Neumann system, this kind of consistency is not difficult to achieve, in general. Or course, this is assuming that our system doesn’t have any bugs.
As soon as a system has any aspect of parallelism, however, consistency becomes a bit more difficult. If we introduce multiple cores, we have some parallelism. If we make the system distributed, the situation becomes even more complex.
As we explained in Chapter 1, the real world doesn’t actually have a globally consistent state, so perhaps it’s acceptable if our software systems don’t either.
In this chapter, we talk about what a transaction means in the context of a distributed system, what the tradeoffs are on consistency, and why global consistency is not the friend of a scalable system. We’ll talk ...