For twenty years, the transaction has been acknowledged as the central abstraction in preventing concurrent applications from corrupting the contents of a database, through errors such as lost update, dirty read or unrepeatable read. The original concurrency control algorithm, strict two-phase locking with shared and exclusive locks, is still widely used in practice, since it is simple to implement and guarantees serializability. Many alternative algorithms have been proposed and, in commercial systems these include variants of keyrange locking to avoid phantoms, and escrow reads to improve throughput on hotspot data. New algorithms continue to appear. These algorithms are usually evaluated by simulation rather than being implemented