Как расшифровывается и что означает ACID в контексте баз данных?

«Как расшифровывается и что означает ACID в контексте баз данных?» — вопрос из категории SQL и базы данных, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

ACID — это набор из четырех ключевых свойств, гарантирующих надежность и предсказуемость транзакций в системах управления базами данных (СУБД).

Расшифровка и практическое значение:

  1. Atomicity (Атомарность): Транзакция выполняется как единое целое. Либо выполняются все ее операции, либо ни одна. Нет промежуточных состояний. В PostgreSQL это обеспечивается механизмом WAL (Write-Ahead Logging). При сбое система использует WAL для отката (ROLLBACK) незавершенной транзакции.

    BEGIN; -- Начало транзакции
    INSERT INTO orders (user_id, total) VALUES (123, 5000);
    UPDATE accounts SET balance = balance - 5000 WHERE user_id = 123;
    -- Если здесь произойдет сбой, оба оператора откатятся.
    COMMIT; -- Фиксация транзакции
  2. Consistency (Согласованность): Каждая успешная транзакция переводит базу данных из одного валидного состояния в другое. Это означает, что все ограничения целостности (PRIMARY KEY, FOREIGN KEY, CHECK, UNIQUE) должны выполняться после COMMIT. Если транзакция нарушает ограничение, она целиком откатывается.

  3. Isolation (Изолированность): Параллельно выполняющиеся транзакции не должны влиять друг на друга. Уровни изоляции (Read Uncommitted, Read Committed, Repeatable Read, Serializable) определяют, какие "грязные", "неповторяющиеся" или "фантомные" чтения допустимы. По умолчанию в PostgreSQL используется Read Committed.

  4. Durability (Долговечность): После успешного завершения транзакции (COMMIT) внесенные ею изменения становятся постоянными и сохраняются даже в случае аппаратного сбоя или перезапуска СУБД. Это обеспечивается синхронной записью данных и WAL на диск.

Пример из опыта: При разработке финансового модуля мы использовали транзакции с уровнем изоляции SERIALIZABLE для операций перевода средств между счетами. Это гарантировало, что даже при одновременных попытках списания с одного счета, только одна транзакция успеет выполниться, а вторая получит ошибку сериализации и будет повторена, что исключает двойное списание.