Вы должны четко понимать два фундаментальных термина, касающихся транзакций: фиксация (commiting) и откат (rolling back) транзакций. Ниже кратко объясняются оба термина.
Фиксация транзакции
Когда вы фиксируете транзакцию, скажем, посредством оператора COMMIT, Oracle делает все изменения, выполненные всеми операторами SQL в рамках этой транзакции,постоянной частью базы данных. Прежде чем Oracle зафиксирует результаты транзакции, он делает следующее.
- Генерирует информацию отмены (undo), которая состоит из значений данных,подлежащих модификации, до изменений. Эти данные сохраняются в сегменте undo, расположенном в табличном пространстве undo.
- Он также генерирует данные повторного выполнения (redo), содержащие изменения в блоках данных и в блоках отката, в буфер журнала повторного выполнения.База данных может писать на диск содержимое буферов журнала повторного выполнения перед фиксацией транзакции.
- Проводит изменения в буферах базы данных, находящихся в SGA. База данных может писать модифицированные буферы на диск перед фиксацией транзакции.
База данных может писать изменения транзакции, которые были выполнены первыми, из буферов базы данных в SGA в файлы данных немедленно или же спустя какое-то время после фиксации транзакции, либо даже перед ее фиксацией. Когда база данных фиксирует транзакцию, она выполняет следующее.
- База данных назначает и записывает SCN для фиксируемой транзакции.
- Писатель журналов пишет элементы журнала повторного выполнения в файл журнала повторного выполнения на диске из буфера журнала повторного выполнения в SGA; он также записывает SCN транзакции в файл журнала повторного выполнения, помечая тем официальную фиксацию транзакции.
- База данных освобождает все блокировки таблиц и строк.
- База данных помечает транзакцию как завершенную.
Откат транзакции
Отменить изменения, выполненные транзакцией, которые еще не были зафиксированы, можно с помощью команды ROLLBACK. В то время как журнал повторного выполнения содержит все изменения, проведенные в транзакции, сегмент отмены (undo) содержит все старые значения, которые существовали до момента проведения изменений. Вы можете либо откатить изменения, проведенные всей транзакцией, либо просто вернуться к маркеру, который поместили ранее внутри транзакции, называемому точкой сохранения (savepoint). Существует несколько типов отката, среди которых перечисленные ниже.
- Откат, запрошенный пользователем.
- Откат, произошедший из-за ненормального прерывания работы процесса или экземпляра.
- Откат незафиксированных транзакций во время восстановления.
- Откат уровня оператора, произошедший из-за ошибки выполнения этого оператора.Независимо от причины отката, процедура всегда одна и та же.
- База данных использует данные в виде, который они имели до изменения в табличном пространстве undo, чтобы отменить все изменения, проведенные во время транзакции.
- База данных освобождает все блокировки транзакции и таблицы.
- База данных завершает транзакцию.