Как свойства ACID определяют поведение транзакции в базах данных?

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

Ответ

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

  • A (Atomicity — Атомарность): Транзакция выполняется как единое целое. Влияние: либо выполняются все операции транзакции, либо ни одна. При сбое все изменения откатываются (rollback).
  • C (Consistency — Согласованность): Транзакция переводит базу данных из одного валидного состояния в другое, соблюдая все бизнес-правила, ограничения целостности (constraints), триггеры.
  • I (Isolation — Изолированность): Параллельно выполняющиеся транзакции изолированы друг от друга. Влияние: их промежуточные результаты не видны другим транзакциям. Уровень изоляции (Read Committed, Repeatable Read и др.) определяет степень этой изоляции и возможные аномалии (грязное чтение, неповторяемое чтение, фантомное чтение).
  • D (Durability — Долговечность): После успешного завершения (commit) изменения, сделанные транзакцией, сохраняются навсегда, даже в случае сбоя системы (за счет записи в WAL — Write-Ahead Log).

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

START TRANSACTION; -- Начало транзакции
  UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
  UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;
  -- ACID гарантирует, что оба UPDATE будут зафиксированы или откатаны вместе.
COMMIT; -- Фиксация изменений (Durability вступает в силу)