Транзакция объединяет несколько операций с базой данных в единый атомарный блок. На уровне СУБД это обеспечивает:
- Атомарность (Atomicity): Все операции внутри транзакции либо выполняются полностью, либо откатываются. Если какая-либо операция завершается с ошибкой, вся транзакция отменяется, и база данных возвращается в состояние до начала транзакции.
- Согласованность (Consistency): Транзакция переводит базу данных из одного согласованного состояния в другое. СУБД следит за соблюдением ограничений целостности (первичные ключи, внешние ключи, уникальные ограничения и т.д.) во время выполнения транзакции.
- Изолированность (Isolation): Транзакции изолированы друг от друга. Изменения, сделанные одной транзакцией, невидимы для других одновременно выполняющихся транзакций до тех пор, пока первая не будет успешно завершена (закоммичена). Уровни изоляции (Read Uncommitted, Read Committed, Repeatable Read, Serializable) определяют, насколько строго соблюдается это правило.
- Надежность (Durability): После успешного завершения (коммита) транзакции, сделанные ею изменения являются постоянными и не будут потеряны даже в случае сбоя системы. СУБД использует журналирование транзакций (write-ahead logging) для обеспечения надежности.
Во время выполнения транзакции СУБД:
- Начинает сбор изменений в временном буфере или журнале транзакций.
- Применяет блокировки на затрагиваемые данные, чтобы другие транзакции не могли одновременно изменять их и предотвратить конфликты (грязные чтения, неповторяющиеся чтения, фантомные чтения). Типы блокировок (разделяемые, эксклюзивные) зависят от выполняемых операций (чтение, запись).
- Журналирует все операции транзакции в журнале транзакций до их фактического применения к основным хранилищам данных. Это позволяет откатить транзакцию при необходимости.
- По завершении успешного выполнения всех операций, данные из временного буфера или журнала транзакций записываются в основные файлы данных (коммит) и/или записываются записи о коммите в журнал, гарантируя надежность.
- В случае ошибки или явного отката (rollback), СУБД использует информацию из журнала транзакций для отмены всех изменений, сделанных этой транзакцией, возвращая базу данных в исходное (до транзакции) состояние.
- Снимает блокировки с затронутых данных, позволяя другим транзакциям получить к ним доступ.
Пример в Ruby on Rails:
ruby
В случае явного управления транзакцией:
ruby