Определение. Транзакция - это последовательность операторов манипулирования данными, выполняющаяся как единое целое (все или ничего) и переводящая базу данных из одного целостного состояния в другое целостное состояние.
Транзакция обладает четырьмя важными свойствами, известными как свойства АСИД:
- (А) Атомарность. Транзакция выполняется как одна операция - либо выполняется вся транзакция целиком, либо она целиком не выполняется.
- (С) Согласованность. Транзакция переводит базу данных из одного согласованного (целостного) состояния в другое согласованное (целостное) состояние. Внутри транзакции согласованность базы данных может нарушаться.
- (И) Изоляция. Транзакции разных пользователей не должны мешать друг другу (например, как если бы они выполнялись строго по очереди).
- (Д) Долговечность (устойчивость). Если транзакция выполнена, то результаты ее работы должны сохраниться в базе данных, даже если в следующий момент произойдет сбой системы.
Транзакция обычно начинается автоматически с момента выполнения запроса и продолжается до тех пор, пока не произойдет одно из следующих событий:
|
|
- Подана команда COMMIT (зафиксировать транзакцию).
- Подана команда ROLLBACK TRANSACTION (откатить транзакцию).
- Произошло отсоединение пользователя от СУБД.
- Произошел сбой системы.
Команда COMMIT завершает текущую транзакцию и автоматически начинает новую транзакцию. При этом гарантируется, что результаты работы завершенной транзакции фиксируются, т.е. сохраняются в базе данных.
Команда ROLLBACK TRANSACTION приводит к тому, что все изменения, сделанные текущей транзакцией откатываются, т.е. отменяются так, как будто их вообще не было. Откат до заданной точки осуществляется командой ROLLBACK TRANSACTION <имя>. При этом автоматически начинается новая транзакция.
При отсоединении пользователя от СУБД происходит автоматическая фиксация транзакций.
Для явной фиксации транзакции в некоторых системах (например, Visual FoxPro, MS SQL Server и др.), требуют начинать транзакцию командой BEGIN TRANSACTION.
Для установления промежуточных точек позволяющих осуществлять откат внутри транзакции используется команда SAVE TRANSACTION <имя>.
При сбое системы и последующем ее запуске происходит анализ выполнявшихся до момента сбоя транзакций. Те транзакции, для которых была выполнена команда COMMIT, но результаты работы которых не были занесены в базу данных выполняются заново (накатываются). Те транзакции, для которых не была выполнена команда COMMIT, откатываются (восстанавливается прежнее состояние БД).
Одним из способов поддержки транзакций является ведение журнала. Журнал транзакций — это структура данных, в которой хранятся записи о планирующихся и выполненных операциях. Работа с ним состоит из трёх шагов:
|
|
1. Записать намерение произвести некоторые операции
2. Запись о выполнении задания
3. Записать об отсутствии ошибок
В случае сбоя запускается процедура восстановления, которая просматривает записи журнала следующим образом:
1. Если повреждена запись, то сбой произошёл во время проставления отметки в журнале. Значит, записи на диск нет (возврат к прежнему состоянию БД при повторной загрузки БД), и потери отсутствуют.
2. Если все записи отмечены как успешно выполненные, то сбой произошёл между транзакциями (данные успешно сохранены на диске), здесь также нет потерь.
3. Если в журнале есть незавершённая транзакция, то сбой произошёл во время записи на диск. В этом случае восстанавливается старая версия данных из сегмента отката (область, в которой хранится копия всех изменяемых в ходе транзакции данных).
Замечание. Каждая база данных SQL Server имеет как минимум два файла, с ней ассоциирующихся: один файл данных, в котором непосредственно хранятся данные и как минимум один файл журнала транзакций. Журнал транзакций это основной компонент СУБД. Все изменения в БД записываются в журнал транзакций. Используя эту информацию, СУБД может определить какая транзакция, и какие изменения были внесены.