Условие
Что такое транзакция в БД?
- Любая операция, влекущая изменение данных в БД.
- Перевод денег между клиентами банка.
- Перенос данных из одной таблицы в другую.
- Набор операций, влекущий изменение состояния содержимого БД только при исполнении всех операций.
- Совокупность действий, несущих цель консистентного переноса данных из таблиц БД в долговременное хранилище данных (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, не имеет отношения к транзакциям БД.
Подводные камни
- Автокоммит. Без
BEGINкаждый запрос — отдельная транзакция. Это безопасно, но не позволяет атомарно выполнить несколько операций. ROLLBACKне отменяет всё.TRUNCATEв некоторых СУБД (MySQL MyISAM) не откатывается. PostgreSQL — откатывает.- Долгие транзакции — зло. Держат блокировки и снапшоты, тормозят VACUUM в PostgreSQL, могут приводить к bloat.
- Изолированность ≠ полная независимость. Уровни изоляции (
READ COMMITTED,REPEATABLE READ,SERIALIZABLE) задают, какие аномалии возможны.
Эталонный ответ
Транзакция — набор операций, влекущий изменение состояния БД только при исполнении всех операций. Главное свойство — атомарность.