  Transactions simplify concurrent programming by enabling computations on
shared data that are isolated from other concurrent computations and are
resilient to failures. Modern databases provide different consistency models
for transactions corresponding to different tradeoffs between consistency and
availability. In this work, we investigate the problem of checking whether a
given execution of a transactional database adheres to some consistency model.
We show that consistency models like read committed, read atomic, and causal
consistency are polynomial time checkable while prefix consistency and snapshot
isolation are NP-complete in general. These results complement a previous
NP-completeness result concerning serializability. Moreover, in the context of
NP-complete consistency models, we devise algorithms that are polynomial time
assuming that certain parameters in the input executions, e.g., the number of
sessions, are fixed. We evaluate the scalability of these algorithms in the
context of several production databases.
