Вложенные транзакции — это транзакции, начатые внутри другой активной транзакции. Они позволяют управлять атомарностью и изоляцией отдельных логических блоков в рамках более крупной операции. Результат вложенной транзакции (успех или откат) зависит от исхода родительской транзакции: если родительская транзакция откатывается, то все вложенные транзакции, независимо от их собственного статуса, также откатываются.
Реализация в разных СУБД может отличаться. В некоторых системах (например, PostgreSQL) они реализуются с помощью сохранения точек (SAVEPOINT).
sql
Ключевые особенности:
Сравнение с обычными транзакциями:
| Особенность | Обычная транзакция | Вложенная транзакция (через SAVEPOINT) |
|---|---|---|
| Начало | Явное BEGIN | Внутри активной транзакции, SAVEPOINT |
| Откат | Полный откат до BEGIN | Может откатиться только до SAVEPOINT |
| Фиксация | Явный COMMIT | Неявно фиксируется при фиксации родительской |
| Зависимость от др. | Независима (если не связана) | Полностью зависит от родительской |
Применяются для обеспечения частичного отката в сложных операциях, когда не весь процесс должен прерваться из-за ошибки в одной из частей. Например, при пакетном обновлении данных, где сбой в обработке одного элемента может не требовать отката всего пакета.
Python-фреймворки, такие как Django или SQLAlchemy, предоставляют абстракции для работы с транзакциями, включая возможность использования точек сохранения или симуляции вложенности через контекстные менеджеры.
python