Что такое транзакция в базе данных и как работают BEGIN, COMMIT и ROLLBACK?
- Зачем нужны транзакции?
- Что будет, если ошибка случится посередине перевода денег?
Транзакция — группа операций, которая выполняется целиком или никак. BEGIN открывает её, COMMIT фиксирует все изменения разом, ROLLBACK отменяет всё сделанное с начала транзакции. Классический пример — перевод: списать со счёта A и зачислить на счёт B. Если после списания произойдёт ошибка, без транзакции деньги пропадут; с транзакцией изменения откатятся.
- Пока транзакция не зафиксирована, другие сессии (обычно) не видят её изменений
- После COMMIT данные сохранены даже при сбое питания (durability)
- Держать транзакцию открытой долго — плохо: она удерживает блокировки
А ещё В коде транзакции обычно открывает фреймворк (@Transactional, with conn.begin())
Подробно
Пример:
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT; -- или ROLLBACK при ошибке
ACID: атомарность (всё или ничего), согласованность (ограничения соблюдены), изоляция (параллельные транзакции не мешают друг другу), долговечность (зафиксированное не теряется).
Ошибки новичков: выполнять связанные изменения в разных транзакциях; делать внутри транзакции долгие внешние вызовы (HTTP, отправку писем) — блокировки держатся всё это время.
Что хотят услышать
- Всё или ничего на примере перевода.
- BEGIN, COMMIT, ROLLBACK.
- Связь с ACID.
- Короткие транзакции без внешних вызовов.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Группа операций «всё или ничего»: COMMIT фиксирует изменения, ROLLBACK отменяет все
- ✗Транзакция ускоряет выполнение запросов за счёт кэша
- ✗ROLLBACK отменяет только последний запрос, а COMMIT фиксирует всё, что сделано с момента BEGIN
- ✗Внутри транзакции полезно делать долгие HTTP-вызовы, чтобы всё было атомарно
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.