Собесов

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

SQLТранзакции и ACIDЛёгкаяJunior

Условие

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

  • Любая операция, влекущая изменение данных в БД.
  • Перевод денег между клиентами банка.
  • Перенос данных из одной таблицы в другую.
  • Набор операций, влекущий изменение состояния содержимого БД только при исполнении всех операций.
  • Совокупность действий, несущих цель консистентного переноса данных из таблиц БД в долговременное хранилище данных (DWH).

Решение

Правильный ответ — набор операций, влекущий изменение состояния содержимого БД только при исполнении всех операций.

Точная формулировка

Транзакция — это логически единый набор SQL-операций, который должен выполниться целиком или не выполниться вовсе (свойство атомарности из ACID).

BEGIN;                                            -- начали транзакцию
UPDATE accounts SET balance = balance - 100 WHERE id = 1;  -- списали
UPDATE accounts SET balance = balance + 100 WHERE id = 2;  -- зачислили
COMMIT;                                           -- зафиксировали

Если между UPDATE упадёт сервер — ROLLBACK отменит обе строки. Не получится «списали, но не зачислили».

ACID

Свойство Что значит
Atomicity (атомарность) Всё или ничего
Consistency (согласованность) До и после транзакции БД в валидном состоянии (FK, CHECK, уникальности)
Isolation (изолированность) Параллельные транзакции не «видят» промежуточные состояния друг друга
Durability (надёжность) Зафиксированные данные не теряются (даже при сбое)

Разбор неверных вариантов

  • «Любая операция, влекущая изменение» — слишком широко. Один UPDATE без BEGIN — это автокоммит-транзакция, частный случай.
  • «Перевод денег» — это пример транзакции, но не определение.
  • «Перенос данных из одной таблицы в другую» — это INSERT INTO ... SELECT, операция, но не транзакция.
  • «Перенос в DWH» — это ETL, не имеет отношения к транзакциям БД.

Подводные камни

  1. Автокоммит. Без BEGIN каждый запрос — отдельная транзакция. Это безопасно, но не позволяет атомарно выполнить несколько операций.
  2. ROLLBACK не отменяет всё. TRUNCATE в некоторых СУБД (MySQL MyISAM) не откатывается. PostgreSQL — откатывает.
  3. Долгие транзакции — зло. Держат блокировки и снапшоты, тормозят VACUUM в PostgreSQL, могут приводить к bloat.
  4. Изолированность ≠ полная независимость. Уровни изоляции (READ COMMITTED, REPEATABLE READ, SERIALIZABLE) задают, какие аномалии возможны.

Эталонный ответ

Транзакция — набор операций, влекущий изменение состояния БД только при исполнении всех операций. Главное свойство — атомарность.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти