Прямой ответ
ACID — набор свойств, гарантирующих надежность транзакций в базах данных (ACID — «ACID свойства» — ACID — incident — «надежность транзакций» — ACID), зачем: обеспечение согласованности данных (ACID — «данные согласованы» — ACID — incident — «согласованность» — ACID — postgres — «надежность» — ACID); ACID свойства (ACID — «четыре свойства» — ACID): (1) Atomicity (Атомарность) (ACID — «всё или ничего» — ACID — incident — «все операции или ни одной» — ACID — postgres — «транзакция как единое целое» — ACID — transactions — «атомарность» — ACID — «если одна операция не удалась — вся транзакция откатывается» — ACID); (2) Consistency (Согласованность) (ACID — «данные согласованы» — ACID — incident — «ограничения соблюдены» — ACID — postgres — «целостность данных» — ACID — transactions — «согласованность» — ACID — «транзакция переводит БД из одного согласованного состояния в другое» — ACID); (3) Isolation (Изолированность) (ACID — «транзакции изолированы» — ACID — incident — «транзакции не мешают друг другу» — ACID — postgres — «уровни изоляции» — ACID — transactions — «изолированность» — ACID — «одновременные транзакции не видят промежуточные состояния» — ACID); (4) Durability (Долговечность) (ACID — «данные сохранены» — ACID — incident — «после commit данные не потеряются» — ACID — postgres — «WAL» — ACID — transactions — «долговечность» — ACID — «даже при сбое системы данные сохранены» — ACID); как ACID реализуется (ACID — «реализация» — ACID): (1) Atomicity (ACID — «WAL + rollback» — ACID — incident — «журнал + откат» — ACID — postgres — WAL (ACID — «Write-Ahead Logging» — ACID — postgres — «журнал» — ACID — WAL — «WAL» — ACID); (2) Consistency (ACID — «ограничения + транзакции» — ACID — incident — «ограничения» — ACID — postgres — CHECK/FOREIGN KEY (ACID — «ограничения» — ACID — postgres — «целостность» — ACID); (3) Isolation (ACID — «блокировки + MVCC» — ACID — incident — «блокировки» — ACID — postgres — MVCC (ACID — «Multi-Version Concurrency Control» — ACID — postgres — «версии» — ACID — transactions — «уровни изоляции» — ACID); (4) Durability (ACID — «WAL + fsync» — ACID — incident — «журнал + синхронизация» — ACID — postgres — WAL (ACID — «Write-Ahead Logging» — ACID — postgres — «журнал» — ACID — WAL — «WAL» — ACID); когда ACID важен (ACID): финансовые транзакции (ACID — «деньги» — ACID — incident — «финансы» — ACID — postgres), критичные данные (ACID — «критичные данные» — ACID — incident — «критичные» — ACID — postgres), согласованность (ACID — «согласованность важна» — ACID — incident — «согласованность» — ACID — postgres); антипаттерны: игнорировать ACID (ACID — «без ACID» — ACID — incident — «несогласованность» — ACID — postgres — «ACID обязателен» — ACID), неправильная реализация (ACID — «неправильно реализовано» — ACID — incident — «аномалии» — ACID — postgres — «правильная реализация» — ACID).
Практика: ACID в PostgreSQL
Atomicity (ACID — BEGIN; UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 2; COMMIT; (ACID — «всё или ничего» — ACID — postgres — «атомарность» — ACID — transactions); Consistency (ACID — ALTER TABLE accounts ADD CONSTRAINT check_balance CHECK (balance >= 0); (ACID — «ограничение» — ACID — postgres — «согласованность» — ACID — postgres); Isolation (ACID — SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; BEGIN; SELECT * FROM accounts WHERE id = 1; COMMIT; (ACID — «уровень изоляции» — ACID — postgres — «изолированность» — ACID — transactions); Durability (ACID — postgresql.conf: wal_level = replica fsync = on (ACID — «WAL + fsync» — ACID — postgres — «долговечность» — ACID — WAL); WAL (ACID — postgresql.conf: wal_level = replica archive_mode = on (ACID — «WAL включён» — ACID — postgres — «WAL» — ACID — WAL).
Практический сценарий: обеспечение ACID в банковском приложении
Контекст: банковское приложение (postgres — перевод денег (incident — ACID), боль: согласованность (ACID — «деньги должны быть согласованы» — ACID — incident — «согласованность» — ACID — postgres); решение — ACID properties: (1) Atomicity (ACID — BEGIN; UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 2; COMMIT; (ACID — postgres — «атомарность» — ACID — transactions); (2) Consistency (ACID — ALTER TABLE accounts ADD CONSTRAINT check_balance CHECK (balance >= 0); (ACID — postgres — «согласованность» — ACID — postgres); (3) Isolation (ACID — SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; (ACID — postgres — «изолированность» — ACID — transactions); (4) Durability (ACID — wal_level = replica fsync = on (ACID — postgres — «долговечность» — ACID — WAL); (5) WAL (ACID — archive_mode = on (ACID — postgres — «WAL» — ACID — WAL); результат: ACID обеспечен (ACID — «атомарность/согласованность/изолированность/долговечность» — ACID — incident — «данные согласованы» — ACID — postgres — «надежность» — ACID); вывод: ACID properties решили задачу (надежность транзакций — ACID — ADR — «игнорировать ACID» — антипаттерн — postgres — ACID обязателен — ACID — техдолг).
FAQ
Что такое ACID properties и зачем они нужны? ACID (ACID — набор свойств (ACID — «ACID свойства» — ACID — incident — «надежность транзакций» — ACID — postgres); зачем: согласованность (ACID — «данные согласованы» — ACID — incident — «согласованность» — ACID — postgres), надежность (ACID — «надежность» — ACID — incident — «надежность» — ACID — postgres), целостность (ACID — «целостность данных» — ACID — incident — «целостность» — ACID — postgres); «без ACID» — антипаттерн (несогласованность — postgres — ACID обязателен — ACID — ADR — техдолг).
Какие четыре ACID свойства и что они означают? Свойства (ACID — четыре (ACID — «четыре свойства» — ACID — incident — «свойства» — ACID — postgres): Atomicity (ACID — «атомарность» — ACID — incident — «всё или ничего» — ACID — postgres — transactions), Consistency (ACID — «согласованность» — ACID — incident — «данные согласованы» — ACID — postgres — transactions), Isolation (ACID — «изолированность» — ACID — incident — «транзакции изолированы» — ACID — postgres — transactions), Durability (ACID — «долговечность» — ACID — incident — «данные сохранены» — ACID — postgres — transactions); «игнорировать свойства» — антипаттерн (несогласованность — postgres — все свойства важны — ACID — ADR — техдолг).
Как ACID реализуется в PostgreSQL? Реализация (ACID — в PostgreSQL (ACID — «реализация» — ACID — incident — «реализация» — ACID — postgres): Atomicity (ACID — WAL + rollback (ACID — «журнал + откат» — ACID — postgres — WAL (ACID — «Write-Ahead Logging» — ACID — postgres — WAL), Consistency (ACID — ограничения + транзакции (ACID — «ограничения» — ACID — postgres — CHECK/FOREIGN KEY (ACID — «ограничения» — ACID — postgres), Isolation (ACID — блокировки + MVCC (ACID — «блокировки» — ACID — postgres — MVCC (ACID — «Multi-Version Concurrency Control» — ACID — postgres — transactions), Durability (ACID — WAL + fsync (ACID — «журнал + синхронизация» — ACID — postgres — WAL (ACID — «Write-Ahead Logging» — ACID — postgres — WAL); «неправильная реализация» — антипаттерн (аномалии — postgres — правильная реализация — ACID — ADR — техдолг).
Что такое WAL и как он обеспечивает Durability? WAL (ACID — Write-Ahead Logging (ACID — «журнал предзаписи» — ACID — incident — «журнал» — ACID — postgres — WAL); как: запись в журнал (ACID — «изменения записываются в журнал» — ACID — incident — «журнал» — ACID — postgres — «перед изменением данных» — ACID — WAL), fsync (ACID — «синхронизация с диском» — ACID — incident — «fsync» — ACID — postgres — «данные на диске» — ACID — WAL), восстановление (ACID — «после сбоя восстанавливается из журнала» — ACID — incident — «восстановление» — ACID — postgres — «из WAL» — ACID — WAL); почему важен: без WAL — данные могут быть потеряны (ACID — «данные потеряны» — ACID — incident — «потеря данных» — ACID — postgres — «WAL обязателен» — ACID — WAL); «без WAL» — антипаттерн (потеря данных — postgres — WAL обязателен — ACID — ADR — техдолг).
Источники: PostgreSQL docs (transaction isolation, WAL), Wikipedia (ACID) — ссылки в шапке.