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. В банковских системах без этих гарантий не обходится ни одна операция с деньгами.