Что такое ACID в контексте баз данных?

«Что такое ACID в контексте баз данных?» — вопрос из категории Базы данных, который задают на 49% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Расшифровка и практический смысл:

  1. Атомарность (Atomicity): Транзакция выполняется как единое целое. Либо выполняются все ее операции, либо ни одна. При сбое (ошибка в коде, отключение питания) СУБД откатывает (rollback) частично выполненные изменения. Это решается механизмом отката (rollback) и журналирования (WAL - Write-Ahead Logging).

    • Пример: Перевод денег между счетами. Списание с одного и зачисление на другой должны произойти вместе. Если зачисление не удалось, списание должно быть отменено.
  2. Согласованность (Consistency): Транзакция переводит базу данных из одного валидного состояния в другое валидное состояние. Это означает, что не нарушаются все заданные правила: ограничения целостности (PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK), триггеры и бизнес-правила.

    • Пример: В таблице employees есть ограничение salary > 0. Транзакция, пытающаяся установить зарплату в -100, будет отменена, и база останется в согласованном состоянии.
  3. Изолированность (Isolation): Параллельно выполняющиеся транзакции не должны влиять друг на друга. Результаты их работы должны быть такими же, как если бы они выполнялись последовательно. На практике полная изоляция дорога, поэтому СУБД предлагают уровни изоляции (читаемость, повторяемость чтения и т.д.), которые ослабляют это свойство для повышения производительности.

    • Проблема: "Грязное" чтение (чтение незафиксированных данных другой транзакции).
    • Решение: Уровень изоляции READ COMMITTED в PostgreSQL предотвращает это.
  4. Долговечность (Durability): После успешного завершения транзакции (COMMIT) внесенные ею изменения становятся постоянными и сохраняются даже в случае сбоя системы (например, после восстановления питания). Это обеспечивается записью данных и журналов транзакций на постоянное хранилище (диск).

Практический пример на SQL:

-- Начало транзакции
BEGIN TRANSACTION;

-- 1. Резервируем товар на складе
UPDATE warehouse SET quantity = quantity - 1 WHERE product_id = 123;
-- 2. Создаем запись о заказе
INSERT INTO orders (user_id, product_id, status) VALUES (456, 123, 'reserved');

-- Если все операции прошли успешно, фиксируем изменения
COMMIT;

-- Если на любом этапе произошла ошибка (например, товара нет в наличии),
-- мы можем откатить все изменения этой транзакции:
-- ROLLBACK;

Важно: Не все СУБД или режимы работы (например, некоторые NoSQL) полностью соответствуют ACID. Часто в распределенных системах жертвуют строгой согласованностью (C) или изолированностью (I) в пользу доступности и устойчивости к разделению (CAP-теорема), что приводит к моделям вроде BASE.

Видео-ответы