Ответ
Согласованность (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) означает линейализуемость — все узлы видят одни и те же данные в один момент времени.