Источник Транзакция. Физический уровень выполнения
Как организован механизм транзакции на физическом уровне? Какие физические объекты ORACLE задействованы при выполнении транзакции? Что происходит при сбое системы? Насколько надежен механизм транзакции?
Механизм работы транзакции основан на двух физических объектах: журнал повторного выполнения и сегмент отката. При выполнении оператора (insert, delete, update) генерируются:
В буферном кеше после проведенных изменений находятся изменения блоков данных, блоков индексов, сегментов отката.
А в буфере журнала повторного выполнения находятся данные повторного выполнения для сегментов отката, блоков данных, блоков индексов.
Возможны следующие варианты дальнейшего развития событий:
Транзакция. Физический уровень выполнения
Механизм работы транзакции основан на двух физических объектах: журнал повторного выполнения и сегмент отката. При выполнении оператора (insert, delete, update) генерируются:
- данные отмены (undo), для того, чтобы при отмене транзакции можно было восстановить согласованное состояние базы данных на начало транзакции (накат назад). Данные отмены состоят из нескольких частей. Например, в данных отмены должны быть не только данные для отмены изменений в таблицах, но и в индексах. Данные отмены хранятся в сегментах отката. Сегменты отката хранятся в табличных пространствах.
- Данные повторного выполнения, для того, чтобы в случае сбоя системы можно было восстановить согласованное состояние системы (накат вперед). Эти данные хранятся в журналах повторного выполнения. Журналы в ORACLE есть оперативные и архивные.
- Данные повторного выполнения формируются также и на изменения в сегментах отката.
В буферном кеше после проведенных изменений находятся изменения блоков данных, блоков индексов, сегментов отката.
А в буфере журнала повторного выполнения находятся данные повторного выполнения для сегментов отката, блоков данных, блоков индексов.
Возможны следующие варианты дальнейшего развития событий:
- происходит сбой системы
- заполняется буферный кеш
- заканчивается транзакция по commit
- заканчивается транзакция по rollback
Происходит сбой системы.
- Если информация находилась только в SGA, и на диск ничего не переносилось, то после перезапуска системы, база данных будет в согласованном состоянии таком, как если бы транзакция не начиналась.
- Если же буфер журнала повторного выполнения был сброшен на диск (это происходит при обработке контрольной точки, или простое LGWR более трех секунд, или буфер заполнен на треть), то сценарий будет немного другим. После перезапуска системы, будет выявлено в журнале повторного выполнения некоторые записи повторного выполнения транзакции. Все эти данные будут накатаны (выполнены). Но потом обнаружится, что транзакция не зафиксирована, и будет проведен откат. База будет в согласованном состоянии, как будто транзакция не выполнялась вообще.
- Если же на диск были частично перенесены кроме данных журналов повторного выполнения ещё и измененные блоки таблиц, индексов, то сценарий будет таковым: так как на изменения в сегментах отката есть записи в журналах повторного выполнения, то сегменты отката будут восстановлены после перезапуска, а система выполнит накат, затем откат. Даже если блоки таблицы были до сбоя записаны на диск, после перезагрузки блоки будут кешированы, возвращены на основе данных сегментов отката в первозданное состояние и со временем будут сброшены на диск. Таким образом, база данных и при этих обстоятельствах в согласованном состоянии, в таком как была до начала транзакции.