Что означает свойство согласованности (Consistency) в ACID-транзакциях?

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

Ответ

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

Ключевые аспекты:

  • Не про бизнес-логику: Это свойство СУБД, а не приложения. СУБД гарантирует, что встроенные ограничения (UNIQUE, NOT NULL, FOREIGN KEY, CHECK) не будут нарушены после фиксации транзакции.
  • Ответственность разработчика: Задача программиста — написать транзакцию так, чтобы она сама переводила базу из одного консистентного состояния в другое. Если в середине транзакции ограничения временно нарушаются — это допустимо, но к моменту COMMIT они должны быть соблюдены.

Пример: Перевод денег между счетами.

START TRANSACTION;
-- Временное нарушение: общая сумма денег в системе изменится
UPDATE accounts SET balance = balance - 100 WHERE id = 1; -- Списали
UPDATE accounts SET balance = balance + 100 WHERE id = 2; -- Зачислили
-- К моменту COMMIT правило "сумма на всех счетах постоянна" снова выполняется.
COMMIT;

Что гарантирует СУБД: Если все ограничения целостности были выполнены до начала транзакции и код транзакции корректен, то после ее завершения (успешного или отката) эти ограничения останутся выполненными.

Нарушение согласованности: Если транзакция пытается зафиксировать данные, нарушающие FOREIGN KEY, СУБД откатит всю транзакцию (сработает свойство Atomicity), чтобы сохранить Consistency.

Consistency vs. Data Consistency в распределенных системах: В контексте ACID это внутренняя целостность одной базы. В распределенных системах (CAP-теорема) «консистентность» (C) означает линейализуемость — все узлы видят одни и те же данные в один момент времени.