Транзакция — это группа операций с базой данных, которая выполняется как единое целое: либо применяются вообще все операции внутри неё, либо не применяется ни одна. Классический пример — перевод денег между счетами: списание с одного счёта и зачисление на другой должны произойти вместе. Если после списания процесс упадёт до зачисления — деньги просто исчезнут. Транзакция гарантирует, что такого разрыва не случится: либо обе операции пройдут, либо база вернётся в состояние до начала перевода, как будто он не начинался.
BEGIN, COMMIT, ROLLBACK
BEGIN;
UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
UPDATE accounts SET balance = balance + 1000 WHERE id = 2;
COMMIT;
UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
UPDATE accounts SET balance = balance + 1000 WHERE id = 2;
COMMIT;
BEGIN открывает транзакцию — все последующие операции пока не видны другим подключениям к базе и не считаются окончательными. COMMIT фиксирует все изменения внутри транзакции разом — с этого момента они становятся видимыми и постоянными. Если вместо COMMIT выполнить ROLLBACK, все изменения внутри транзакции отменяются полностью, как будто их не было — база возвращается к состоянию на момент BEGIN.
BEGIN;
UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
-- здесь произошла ошибка (например, второй UPDATE не выполнился)
ROLLBACK;
BEGIN;
UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
-- здесь произошла ошибка (например, второй UPDATE не выполнился)
ROLLBACK;
Это ключевое отличие от выполнения тех же двух UPDATE без транзакции: без BEGIN/COMMIT каждый UPDATE фиксируется в базе сразу и независимо — если второй не выполнится из-за сбоя, первый уже необратимо применён, и деньги действительно исчезают с одного счёта, не появившись на другом.
ACID — четыре гарантии транзакций
Atomicity (атомарность) — транзакция выполняется целиком или не выполняется вовсе, промежуточного состояния не бывает. Это именно то, что показано в примере с переводом денег: оба UPDATE либо применятся вместе, либо ни один.
Consistency (согласованность) — транзакция переводит базу из одного согласованного состояния в другое, не нарушая ограничений целостности (внешние ключи, CHECK-ограничения, уникальность). Если транзакция должна была бы оставить базу в состоянии, нарушающем эти правила, она не применится.
Isolation (изолированность) — параллельно выполняющиеся транзакции не видят промежуточных, незафиксированных изменений друг друга. Пока транзакция не сделала COMMIT, другие подключения к базе видят данные в том виде, в каком они были до её начала (конкретная степень изоляции регулируется уровнем изоляции транзакций — она не абсолютна и настраивается).
Durability (устойчивость) — после COMMIT изменения сохраняются даже при сбое сервера сразу после этого: база физически записывает изменения на диск таким образом, чтобы они пережили падение процесса или отключение питания.
Consistency (согласованность) — транзакция переводит базу из одного согласованного состояния в другое, не нарушая ограничений целостности (внешние ключи, CHECK-ограничения, уникальность). Если транзакция должна была бы оставить базу в состоянии, нарушающем эти правила, она не применится.
Isolation (изолированность) — параллельно выполняющиеся транзакции не видят промежуточных, незафиксированных изменений друг друга. Пока транзакция не сделала COMMIT, другие подключения к базе видят данные в том виде, в каком они были до её начала (конкретная степень изоляции регулируется уровнем изоляции транзакций — она не абсолютна и настраивается).
Durability (устойчивость) — после COMMIT изменения сохраняются даже при сбое сервера сразу после этого: база физически записывает изменения на диск таким образом, чтобы они пережили падение процесса или отключение питания.
Уровни изоляции — почему Isolation не абсолютна
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
Полная изоляция каждой транзакции от каждой другой обходится дорого по производительности — базы данных предлагают несколько уровней изоляции с разным компромиссом между корректностью и скоростью. READ COMMITTED (уровень по умолчанию в PostgreSQL, Oracle, SQL Server — но не везде: у MySQL/InnoDB по умолчанию используется более строгий REPEATABLE READ) гарантирует, что транзакция не увидит незафиксированные изменения других транзакций, но может увидеть разные данные при двух последовательных чтениях в рамках одной транзакции, если между ними другая транзакция успела закоммититься. Более строгие уровни (REPEATABLE READ, SERIALIZABLE) дают более сильные гарантии ценой большей вероятности конфликтов и отказов при параллельной записи.
Когда транзакции обязательны
Транзакции нужны там, где несколько операций логически образуют одно действие, и промежуточное, наполовину выполненное состояние недопустимо: переводы денег, оформление заказа с одновременным списанием товара со склада, любое изменение нескольких связанных таблиц, которое должно либо пройти целиком, либо не пройти вовсе. Для одиночных независимых операций (один INSERT, один UPDATE) явная транзакция обычно не нужна — большинство СУБД по умолчанию оборачивает каждый отдельный запрос в собственную неявную транзакцию.
Частые вопросы про транзакции и ACID
Что произойдёт, если сервер БД упадёт посреди транзакции, до COMMIT? Все изменения внутри незакоммиченной транзакции будут отменены автоматически при перезапуске — это прямое следствие атомарности. Данные останутся в том состоянии, в котором были до BEGIN.
Можно ли отменить транзакцию после COMMIT? Нет, COMMIT — это точка невозврата: после него изменения зафиксированы и постоянны (durability). Чтобы отменить уже закоммиченные изменения, нужна отдельная новая транзакция, которая явно возвращает данные к прежнему виду.
Зачем нужны разные уровни изоляции, если можно всегда использовать самый строгий? Самый строгий уровень изоляции (SERIALIZABLE) даёт максимальную корректность, но заметно снижает пропускную способность базы при параллельной работе — транзакции чаще конфликтуют и откатываются. Выбор уровня изоляции — компромисс между строгостью гарантий и производительностью под конкретную нагрузку.
Нужна ли транзакция для одного простого запроса SELECT или UPDATE? Обычно нет — большинство СУБД автоматически оборачивают каждый отдельный запрос в неявную транзакцию с автокоммитом. Явную транзакцию стоит открывать, когда несколько операций должны быть логически атомарными вместе.
Можно ли отменить транзакцию после COMMIT? Нет, COMMIT — это точка невозврата: после него изменения зафиксированы и постоянны (durability). Чтобы отменить уже закоммиченные изменения, нужна отдельная новая транзакция, которая явно возвращает данные к прежнему виду.
Зачем нужны разные уровни изоляции, если можно всегда использовать самый строгий? Самый строгий уровень изоляции (SERIALIZABLE) даёт максимальную корректность, но заметно снижает пропускную способность базы при параллельной работе — транзакции чаще конфликтуют и откатываются. Выбор уровня изоляции — компромисс между строгостью гарантий и производительностью под конкретную нагрузку.
Нужна ли транзакция для одного простого запроса SELECT или UPDATE? Обычно нет — большинство СУБД автоматически оборачивают каждый отдельный запрос в неявную транзакцию с автокоммитом. Явную транзакцию стоит открывать, когда несколько операций должны быть логически атомарными вместе.
Закрепить транзакции на практике
Разница между уровнями изоляции ощущается только тогда, когда сам напишешь конкурентные транзакции и увидишь конфликт. Потренироваться можно на тренажёре SQL Arena от Quality Academy — больше 800 задач с переключением диалекта.
-------
Полезные ссылки школы
Сайт Quality Academy:
/main
Telegram-канал:
https://t.me/quality_academy
YouTube-канал:
https://www.youtube.com/@quality_academy
ВКонтакте:
https://vk.com/quality_academy
Канал отзывов учеников (58+ отзывов):
https://t.me/quality_academy_reviews
Задать вопрос менеджеру:
https://t.me/quality_academy_bot
Тест «Подойдёт ли вам тестирование»:
https://quiz.quality-academy.ru
5000+ вопросов с собесов тестировщика — бот-тренажёр:
https://t.me/quality_academy_interview_bot
3 практические задачи и дорожная карта:
https://t.me/quality_academy_tasks_bot
Бесплатные тренажёры — SQL Arena, Playwright Arena, Python Arena:
SQL Arena · Playwright Arena · Python Arena
/main
Telegram-канал:
https://t.me/quality_academy
YouTube-канал:
https://www.youtube.com/@quality_academy
ВКонтакте:
https://vk.com/quality_academy
Канал отзывов учеников (58+ отзывов):
https://t.me/quality_academy_reviews
Задать вопрос менеджеру:
https://t.me/quality_academy_bot
Тест «Подойдёт ли вам тестирование»:
https://quiz.quality-academy.ru
5000+ вопросов с собесов тестировщика — бот-тренажёр:
https://t.me/quality_academy_interview_bot
3 практические задачи и дорожная карта:
https://t.me/quality_academy_tasks_bot
Бесплатные тренажёры — SQL Arena, Playwright Arena, Python Arena:
SQL Arena · Playwright Arena · Python Arena