Представьте, что вы переводите деньги другу через банковское приложение. Нажали кнопку — сумма списалась с вашего счёта, но вдруг свет выключился, интернет пропал, или сервер "упал". Вернутся ли ваши деньги? Не появится ли сумма и у вас, и у друга? Именно такие кошмары предотвращают ACID-транзакции — фундаментальный принцип, который делает цифровой мир предсказуемым и безопасным.
Что такое ACID? Не химия, а надёжность
ACID — это не вещество, а акроним (аббревиатура, где каждая буква имеет значение), описывающий четыре ключевых свойства транзакций в базах данных. Транзакция — это группа операций, которые выполняются как единое целое. Например, перевод денег включает две операции: списание с одного счёта и зачисление на другой.
Термин ACID ввёл немецкий учёный Тео Хэрдер и американский исследователь Андреас Ройтер в 1983 году для формализации требований к надёжным транзакциям.
Расшифровываем ACID по буквам
A — Atomicity (Атомарность)
Атомарность означает «неделимость». Транзакция либо выполняется целиком, либо не выполняется вовсе. Невозможно состояние, когда деньги списались, но не зачислились. Если что-то пошло не так на любом этапе, система откатывает (ROLLBACK) все изменения, как будто ничего и не было.
C — Consistency (Согласованность)
Транзакция переводит базу данных из одного корректного состояния в другое. Все правила (например, «баланс не может быть отрицательным») соблюдаются. Если перевод приведёт к отрицательному балансу, транзакция не выполнится.
I — Isolation (Изолированность)
Параллельные транзакции не должны мешать друг другу. Если два человека одновременно переводят деньги с одного счёта, система обработает операции так, как если бы они шли последовательно. Вы не увидите «промежуточных» грязных данных от другой транзакции.
D — Durability (Долговечность)
Раз уж транзакция завершилась успешно (COMMIT), её изменения сохранены навсегда. Даже если сразу после этого отключится электричество, сервер сгорит или произойдёт сбой, данные не пропадут. Они записаны в постоянную память (например, на SSD-диск).
Где мы встречаем ACID в жизни?
Эти принципы работают не только в банках:
- Онлайн-покупки: Резервирование товара на складе и списание денег — единая транзакция.
- Бронирование билетов: Место в самолёте или номера в отеле не могут быть проданы двум разным людям.
- Социальные сети: Когда вы ставите лайк, счётчик увеличивается ровно на единицу, даже при тысячах одновременных действий.
- Игры (MMO): Передача предмета между игроками должна быть атомарной, чтобы предмет не исчез и не продублировался.
Не все базы данных строго следуют ACID. Некоторые NoSQL-системы (например, для Big Data) сознательно жертвуют полной согласованностью или изолированностью ради скорости и масштабируемости, следуя модели BASE. Это компромисс.
Как это работает технически? Кратко и просто
Представьте журнал (лог) в бухгалтерской книге:
- Перед изменением данных система записывает в специальный журнал, что она собирается сделать (стадия «Подготовка»).
- Затем выполняет сами операции.
- После успешного выполнения ставит в журнале отметку «Сделано» (Commit).
- Если на этапе 2 произошёл сбой, система, перезагрузившись, заглядывает в журнал, видит незавершённую операцию и откатывает изменения по инструкциям из лога.
Этот журнал (Write-Ahead Log, WAL) и есть ключ к долговечности и атомарности.
FAQ: Часто задаваемые вопросы
ACID — это про базы данных или про программирование?
Это свойство систем управления базами данных (СУБД), таких как PostgreSQL, MySQL, Oracle. Программист пишет код транзакции, но обеспечивает эти свойства сама СУБД.
Все ли базы данных поддерживают ACID?
Нет. Классические реляционные (SQL) базы данных (PostgreSQL, MySQL с движком InnoDB) — да. Многие современные NoSQL-базы (например, Redis для некоторых операций, MongoDB с транзакциями в новых версиях) также добавили поддержку, но изначально создавались без полного ACID.
Что важнее: скорость или ACID?
Это вечный компромисс. Гарантии ACID требуют накладных расходов на проверки и синхронизацию, что может снижать скорость. Для высоконагруженных систем, где допустима небольшая задержка в согласованности (например, лайки в соцсети), иногда жертвуют строгим ACID.
Можно ли объяснить Isolation на бытовом примере?
Конечно! Представьте, что вы и ваш коллега одновременно редактируете один документ Google Docs. Без изоляции вы видели бы каждое незавершённое нажатие клавиши друг друга, что создало бы хаос. Благодаря изоляции вы работаете со своей «копией» данных, а система потом аккуратно объединяет изменения.