Транзакции и ACID
Всё или ничего: транзакции
Транзакция — это группа операций, которые выполняются как единое целое: либо применяются все, либо ни одной. Классический пример — бронирование: списать оплату и занять место нужно вместе. Если что-то пошло не так посередине — отменяются обе операции, чтобы не осталось «оплатил, но места нет».
BEGIN; -- начать транзакцию
UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
UPDATE accounts SET balance = balance + 1000 WHERE id = 2;
COMMIT; -- зафиксировать изменения
-- ROLLBACK; — наоборот, отменить всё, что сделано после BEGIN
BEGIN— открывает транзакцию;COMMIT— фиксирует все изменения (они становятся видимы другим и сохраняются);ROLLBACK— откатывает все изменения с моментаBEGIN, как будто их не было.
Свойства ACID
- Atomicity (атомарность) — всё или ничего.
- Consistency (согласованность) — база переходит из одного корректного состояния в другое (соблюдаются ограничения).
- Isolation (изолированность) — определяет, какие эффекты параллельных транзакций могут быть видны друг другу.
- Durability (устойчивость) — после успешного
COMMITСУБД должна сохранить изменения при последующем системном сбое.
Уровни изоляции
Когда много пользователей работают одновременно, возможны «аномалии»: один читает то, что другой ещё не зафиксировал, и т.п. Уровень изоляции определяет, насколько строго транзакции отгорожены друг от друга. Чем строже — тем меньше аномалий, но выше накладные расходы:
В PostgreSQL уровень по умолчанию — Read Committed: каждый оператор видит снимок только зафиксированных данных на момент начала этого оператора. Для критичных сценариев используют Repeatable Read или самый строгий Serializable. Последний не запускает транзакции буквально по очереди, но гарантирует результат, эквивалентный некоторому последовательному порядку; при конфликте одну из транзакций может потребоваться повторить.
💡 Обзорный урок: на учебной базе (только чтение) выполнять транзакции с изменениями нельзя, поэтому здесь — теория. Главное — понимать идею «всё или ничего», смыслCOMMIT/ROLLBACKи зачем нужны уровни изоляции.
Практика
6- Тест 1 — Что гарантирует атомарность (Atomicity) транзакции?
- Тест 2 — Что делает команда ROLLBACK?
- Тест 3 — Какой уровень изоляции используется в PostgreSQL по умолчанию?
- Тест 4 — Что означает свойство Durability (устойчивость)?
- Тест 5 — Сессия А выполнила BEGIN и UPDATE строки, но ещё не сделала COMMIT. Сессия Б на уровне Read Committed читает ту же строку. Что она увидит?
- Тест 6 — Соединение оборвалось после UPDATE, но до COMMIT. Что будет с изменениями?
Задачи решаются прямо здесь, в браузере, на учебной базе — нужна только бесплатная регистрация, чтобы сохранялись ответы и прогресс.