ACID

Четыре гарантии надежных транзакций в базе данных: атомарность, согласованность, изолированность и долговечность.

ACID — четыре свойства, которые гарантирует надежная база данных при выполнении транзакций. Транзакция — группа операций, которые должны выполниться как одно целое. Классический пример — перевод денег: списать со счета и зачислить на другой. Если выполнится только половина, деньги пропадут или появятся из ниоткуда. ACID не дает этому случиться.

Четыре буквы

  • A — Atomicity, атомарность. Транзакция выполняется целиком или не выполняется вовсе. Сбой посередине — и база откатывается к состоянию до начала.
  • C — Consistency, согласованность. Транзакция переводит базу из одного правильного состояния в другое: соблюдаются все ограничения — уникальность номеров, связи между таблицами, запрет отрицательного остатка.
  • I — Isolation, изолированность. Параллельные транзакции не видят промежуточных результатов друг друга и не мешают друг другу.
  • D — Durability, долговечность. Подтвержденная транзакция сохранится, даже если через секунду отключится питание.

Как это выглядит

-- SQL
BEGIN;
UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
UPDATE accounts SET balance = balance + 1000 WHERE id = 2;
COMMIT;

Пока не выполнена команда COMMIT, изменения не видны другим и могут быть отменены. Если между двумя обновлениями произойдет сбой, база отменит первое — деньги останутся на месте.

Уровни изоляции

Полная изоляция дорога, поэтому базы данных предлагают уровни — от слабого к строгому: read uncommitted, read committed, repeatable read и serializable. Чем слабее уровень, тем выше скорость, но тем больше возможных аномалий: например, при повторном чтении в той же транзакции можно увидеть уже другие данные. В PostgreSQL по умолчанию используется read committed, а для операций, где важна каждая копейка, выбирают более строгие уровни или явные блокировки.

Как достигается долговечность

Прежде чем изменить данные, база записывает их в журнал упреждающей записи (WAL) на диске. После сбоя она восстанавливает все подтвержденные транзакции по журналу. Тот же журнал используется для репликации на резервные серверы.

ACID и NoSQL

Многие распределенные NoSQL-хранилища ради скорости и масштабируемости жертвуют частью гарантий и обещают «согласованность в конечном счете»: данные на всех узлах совпадут, но не мгновенно. Такой подход называют BASE. MongoDB и другие системы со временем добавили транзакции, но в финансовых и учетных системах по-прежнему выбирают СУБД с полной поддержкой ACID. В банковских системах без этих гарантий не обходится ни одна операция с деньгами.