0Pricing
Coding Interview Prep · Урок

Объяснение свойств ACID

Атомарность, согласованность, изоляция и долговечность на конкретных примерах

«Объяснение свойств ACID» — бесплатный урок Coding Interview Prep на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Coding Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Coding Interview Prep содержит 4 уроков всего.

Почему на собеседованиях спрашивают об ACID

Когда опытный интервьюер говорит «объясните ACID по шагам», он проверяет не то, запомнили ли Вы четыре слова. Он хочет понять, знаете ли Вы, что база данных гарантирует, когда множество пользователей обращаются к ней одновременно.

ACID расшифровывается как атомарность, согласованность, изоляция и надёжность. Каждая транзакционная СУБД (PostgreSQL, MySQL/InnoDB, сервер SQL, Оракл) обещает эти четыре свойства для операций, выполняемых в транзакции.

Лучшие ответы связывают каждую букву с конкретным сбоем, которому она препятствует. Именно этим мы и займёмся в следующих сценах.

Что такое транзакция?

Транзакция — это единица работы, которую база данных рассматривает как единый неделимый этап. Вы начинаете её с помощью BEGIN, выполняете один или несколько операторов, а затем либо используете COMMIT, чтобы сделать изменения постоянными, либо ROLLBACK, чтобы отменить всё.

Классический пример — банковский перевод: списать средства с одного счёта и зачислить их на другой. Должны произойти оба действия или ни одно. Транзакция — это оболочка, которая позволяет гарантировать это условие.

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;

A = Атомарность

Атомарность означает, что транзакция выполняется целиком или не выполняется вообще. Если какой-либо оператор завершается ошибкой или сервер выходит из строя в процессе, все изменения этой транзакции откатываются, как будто она никогда не начиналась.

В примере с переводом, если зачисление завершается ошибкой после успешного списания, атомарность гарантирует, что списание тоже будет отменено. Вы никогда не потеряете деньги из-за незавершённой операции.

Формулировка для собеседования: «Атомарность гарантирует, что транзакция фиксируется целиком или не фиксируется вообще, не оставляя частичного состояния».

Атомарность в действии

Здесь второе обновление нарушает ограничение CHECK (баланс не может быть отрицательным). База данных прерывает транзакцию, а ROLLBACK также отменяет первое обновление.

Главное для собеседования: после отката на счёте 1 по-прежнему находится исходный баланс. В таблице не остаётся частичной записи.

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- next line fails: balance would go below 0
UPDATE accounts SET balance = balance - 999999 WHERE id = 2;
ROLLBACK;  -- account 1 is restored to its original balance

C = Согласованность

Согласованность означает, что транзакция переводит базу данных из одного корректного состояния в другое корректное состояние. Каждая зафиксированная транзакция должна соблюдать все определённые правила: ограничения, внешние ключи, триггеры и каскадные операции.

Если транзакция оставила бы нарушенное ограничение (сиротскую запись по внешнему ключу, дублирующийся первичный ключ или невыполненное CHECK), база данных не позволит её зафиксировать.

Важный нюанс: база данных обеспечивает соблюдение объявленных правил, но инварианты на уровне приложения («у пользователя может быть не более 3 активных сеансов») — это ваша задача, если они не смоделированы в виде ограничений.

Согласованность, обеспечиваемая ограничениями

Согласованность в основном является совокупностью правил схемы. Ниже внешний ключ гарантирует, что Вы никогда не сможете добавить заказ для несуществующего клиента.

Если вставка ссылается на отсутствующего клиента, транзакция завершается ошибкой, атомарность откатывает её, и согласованность сохраняется. Поэтому на собеседованиях говорят, что атомарность и согласованность работают вместе.

CREATE TABLE orders (
  id INT PRIMARY KEY,
  customer_id INT NOT NULL REFERENCES customers(id),
  amount NUMERIC(10,2) CHECK (amount > 0)
);

-- This fails if customer 999 does not exist, keeping data consistent
INSERT INTO orders (id, customer_id, amount) VALUES (1, 999, 50.00);

I = Изолированность

Изолированность означает, что параллельные транзакции не мешают друг другу. В идеале каждая транзакция ведёт себя так, будто выполняется в одиночестве, даже когда одновременно выполняются десятки транзакций.

На практике базы данных предлагают разные уровни изоляции, позволяющие выбирать между строгостью и производительностью. Более слабые уровни допускают определённые аномалии (грязные чтения, фантомы) в обмен на более высокий уровень параллелизма.

Это самая содержательная часть любого собеседования по ACID, поэтому следующие два урока подробно рассматривают уровни изоляции и аномалии чтения.

Почему изоляция имеет разные уровни

Идеальная изоляция (SERIALIZABLE) требует больших затрат, поскольку должна предотвращать любой возможный конфликт при чередовании операций, часто блокируя транзакции или прерывая их.

Поэтому стандарт SQL определяет четыре уровня. Распространённая ловушка на собеседовании: кандидаты считают, что изоляция бывает только двух видов. Это не так. Вы явно выбираете нужную степень изоляции.

  • READ UNCOMMITTED — самый слабый уровень
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE — самый строгий уровень
BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SELECT SUM(balance) FROM accounts;
-- ... business logic ...
COMMIT;

D = Долговечность

Долговечность означает, что после фиксации транзакции её изменения переживают сбои, отключение питания и перезапуски. Зафиксированная транзакция находится в устойчивом хранилище.

Базы данных обеспечивают это с помощью журнала предварительной записи (WAL): изменения записываются в надёжный журнал до обновления файлов данных. После перезапуска движок воспроизводит журнал, чтобы восстановить зафиксированную работу, которая ещё не успела попасть в основные файлы.

Формулировка для собеседования: «Долговечность гарантируется с помощью WAL; фиксация возвращает результат только после того, как запись журнала сброшена на диск».

Объединяем все свойства на примере банковского перевода

Один перевод одновременно демонстрирует все четыре свойства:

  • Атомарность: применяются оба обновления или ни одно.
  • Согласованность: ограничение CHECK не позволяет балансам стать отрицательными.
  • Изолированность: параллельный читатель не видит незавершённый перевод.
  • Долговечность: после COMMIT новые балансы переживают сбой.

Умение связать один пример со всеми четырьмя буквами — именно то, что приносит баллы на собеседовании.

BEGIN;
UPDATE accounts SET balance = balance - 100
  WHERE id = 1 AND balance >= 100;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;

Распространённые дополнительные вопросы

На собеседованиях часто проверяют понимание пограничных случаев. Будьте готовы к таким вопросам:

  • «Какое свойство обеспечивает внешний ключ?» Согласованность.
  • «Что защищает от сбоя сервера в середине транзакции?» Атомарность (откат незафиксированных изменений) вместе с долговечностью (воспроизведение зафиксированных изменений).
  • «Является ли изоляция бесплатной?» Нет, более строгая изоляция снижает параллелизм.
  • «Обеспечивают ли хранилища NoSQL свойства ACID?» Многие обменивают их на доступность (BASE); скажите, что это зависит от движка.

Быстрая проверка

Проверьте, насколько хорошо Вы понимаете назначение каждого свойства ACID.

Итоги: ACID в двух словах

Теперь Вы можете чётко ответить на этот вопрос:

  • Атомарность — выполнение целиком или невыполнение вообще; частичная работа откатывается.
  • Согласованность — каждая фиксация соблюдает ограничения и оставляет базу данных в корректном состоянии.
  • Изолированность — параллельные транзакции не повреждают данные друг друга; степень строгости можно настроить.
  • Долговечность — зафиксированные данные переживают сбои благодаря журналу предварительной записи.

Свяжите каждую букву с конкретным сбоем, который она предотвращает, и Вы уверенно пройдёте начало любого собеседования по параллельным операциям.

Часто задаваемые вопросы

Урок «Объяснение свойств ACID» бесплатный?

Да — полный текст урока «Объяснение свойств ACID» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Coding Interview Prep, подпишись на CoddyKit PRO. Курс Coding Interview Prep содержит 4 уроков всего.

Чему я научусь в уроке «Объяснение свойств ACID»?

Атомарность, согласованность, изоляция и долговечность на конкретных примерах Ты практикуешь Coding Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Coding Interview Prep?

Предыдущий опыт не требуется. Coding Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Объяснение свойств ACID»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Coding Interview Prep?

Да. Каждый урок Coding Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Объяснение свойств ACID
  2. Четыре уровня изоляции
  3. Грязное, неповторяемое и фантомное чтение
  4. Взаимные блокировки, блокировки и MVCC
← Назад к Coding Interview Prep