Встречается на 43% собеседований по Java

Что такое ACID

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

Как это работает

Каждая буква акронима соответствует одному требованию к транзакции:

  • A — Атомарность (Atomicity): транзакция выполняется как единое целое. Либо выполняются все её операции, либо ни одна. Если на каком-то шаге происходит ошибка, выполняется откат (rollback) — все уже произведённые изменения отменяются, и система возвращается в состояние, которое было до начала транзакции. Внешне это выглядит так, будто транзакции не существовало.

  • C — Согласованность (Consistency): после успешного завершения транзакции база данных остаётся в согласованном состоянии, то есть все бизнес-правила и ограничения целостности соблюдены. Например, при переводе денег сумма списания с одного счёта должна быть равна сумме зачисления на другой. Согласованность не может быть обеспечена только автоматическими проверками — её должны поддерживать разработчики, правильно реализуя логику транзакций.

  • I — Изолированность (Isolation): параллельно выполняющиеся транзакции не должны влиять на результат друг друга. Это требование дорогостоящее, поэтому в реальных СУБД существуют уровни изоляции, которые позволяют ослабить изоляцию ради повышения производительности. Например, уровень Read Committed допускает чтение данных, зафиксированных другими транзакциями, но не видит незафиксированных изменений.

  • D — Стойкость (Durability): после того как транзакция успешно завершена и пользователь получил подтверждение, её изменения сохраняются даже при сбоях (например, отключение питания или аппаратные ошибки). После восстановления системы данные остаются в том виде, который был зафиксирован транзакцией.

Пример

Рассмотрим банковский перевод: списание 1000 рублей со счёта A и зачисление на счёт B. Без ACID возможны проблемы: если списание произошло, а зачисление нет, деньги пропадут. Свойства ACID решают это так:

  • Атомарность: если зачисление не удалось, списание откатывается — деньги остаются на счёте A.
  • Согласованность: после транзакции сумма на счетах A и B соответствует правилу: списанная сумма равна зачисленной.
  • Изолированность: пока транзакция не завершена, другие транзакции не видят промежуточного состояния (например, когда деньги уже списаны, но ещё не зачислены).
  • Стойкость: после подтверждения перевода данные о новом балансе сохраняются даже при сбое системы.

Подводные камни

  • Согласованность — это не только про ограничения целостности. Она включает бизнес-правила, которые не могут быть автоматически проверены СУБД. Например, правило «сумма перевода не должна превышать остаток на счёте» должно быть реализовано в коде приложения.
  • Изоляция не бесплатна. Полная изоляция (сериализуемость) снижает производительность, поэтому на практике используются более слабые уровни изоляции, которые могут приводить к фантомным чтениям или неповторяющимся чтениям.
  • Атомарность не означает одновременность. Операции внутри транзакции выполняются последовательно, но откат делает их результат невидимым для внешнего мира.
  • Стойкость зависит от журналирования. Для обеспечения стойкости СУБД использует журнал транзакций (WAL), который позволяет восстановить данные после сбоя.

Когда использовать

ACID — это стандарт для систем, где критична надёжность данных: банковские системы, электронная коммерция, системы бронирования. Однако в высоконагруженных распределённых системах часто выбирают компромисс — BASE (Basically Available, Soft state, Eventually consistent), который жертвует согласованностью ради доступности и производительности. Выбор между ACID и BASE зависит от требований конкретного приложения.

Коротко

  • ACID — это атомарность, согласованность, изолированность и стойкость.
  • Атомарность гарантирует «всё или ничего», изолированность — независимость параллельных транзакций.
  • Согласованность требует соблюдения бизнес-правил, а стойкость — сохранения данных после сбоев.
  • В реальных СУБД изоляция может быть ослаблена уровнями изоляции для повышения производительности.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы