|
Как
транзакции используют Undo сегменты.
(OCP
Oracle 9i Database: Fundamentals I Exams Guide. Autors Jason S. Couchman,
Sudheer N. Marisetti)
перевод
Алексея Козлова (alexbk@mail.ru)
Транзакции,
совершаемые в базе
данных Oracle,
требуют сегментов отката (ubdo segments) для
хранения незакомиченных (uncommitted)
изменений данных. Транзакции назначаются
сегментам отката одним из двух путей. Вы
можете определить явно сегмент отката
транзакции выполнив команду set
transaction use rollback segment undo_seg.
Или, если ни одного сегмента отката явно не
определено для транзакции, Oracle назначает
транзакцию тому сегменту отката, который в
данный момент имеет наименьшую
транзакционную загрузку, по круговому
циклическому(round-robin) методу. Таким образом,
более чем одна транзакция может
использовать один и тот же сегмент отката,
но каждый блок в сегменте отката содержит
данные одной и только одной транзакции.
Сегменты откаты
используются следующим образом. Обычно
сегмент отката имеет несколько экстентов,
выделенных ему в любое заданное время, и эти
экстенты используются последовательно.
После старта базы данных первая транзакция
будет назначена первому сегменту отката и
она будет хранить изменяемые ей данные в
экстенте #1 сегмента отката. В течение
развития транзакции (например, долго
работающий пакетный процесс с тысячами
операторами update)
она размещает все больше и больше данных в
экстенте #1 сегмента отката. Экстент,
содержащий данные развивающейся
транзакции, называется активный (active)
экстент. Все больше и больше транзакций
стартуют в базе данных, и некоторые из этих
транзакций могут быть назначены в этот же
сегмент отката. Каждая транзакция будет
заполнять экстент #1 все большим и большим
количеством измененных данных до тех пор,
пока не будет commit
транзакции.
Если экстент #1
заполнится измененными данными до commit'а
транзакции, транзакция начнет заполнять
экстент #2 данными. Транзакции с изменяемыми
данными, распространяемые
на новый экстент, называются вызывающие
расширение. Специальный маркер, называемый head
сегмента отката, переносится из экстента #1
в экстент #2, чтобы указать на экстент, куда
новые и существующие транзакции,
назначенные сегменту отката, могут писать
их новые изменения данных. Как только
транзакция сделает commit
изменения данных, пространство в экстенте #1,
используемое для хранения ее изменений
данных, больше не требуется. Если экстент #1
заполнен только данными зафиксированной
транзакции, экстент #1 считается неактивным (inactive).
Рисунок 1 показывает этот тип поведения
сегмента отката.

Рисунок 1.
Для эффективного
использования пространства сегмента
отката сегмент отката выделяет всего
несколько экстентов, и эти экстенты часто
повторно используются. Идеальная работа
сегмента отката, состоящего из пяти
экстентов, следующая: транзакции,
назначенные сегменту отката, должны
заполнять экстент #5
немного после того, как транзакции с
измененными данными в экстенте #1 были
зафиксированы (commit).
Таким образом экстент #1 становится
неактивным сразу перед тем как транзакциям
в экстенте #5 будет необходимо охватить его.
Однако, такое поведение не всегда возможно.
Если транзакция протекает длительное время
без фиксации изменений данных, она может в
конечном итоге заполнить все экстенты в
сегменте отката. Когда такое происходит,
сегмент отката получает экстент #6 и
переносит изменяемые данные
в текущей транзакции в него. Заголовок (head)
сегмента отката также перемещается в
экстент #6. Рисунок 2 отображает как Oracle
получает или выделяет больше экстентов для
сегмента отката.

Рисунок 2.
Если транзакция
послужила причиной для выделения сегменту
отката максимального количества экстентов
для хранения измененных данных длинной
транзакции – которое определено storage
опцией maxextents, определяемой
во время создания сегмента отката –
сегмент отката становится ненормально
вытянутой неправильной формы. Oracle
имеет опцию optimal,
доступную в storage
сегмента отката, для освобождения
экстентов после длительной транзакции,
вызвавшей выделение большего количества
экстентов, чем это реально необходимо.
Оператор optimal определяет
идеальный размер сегмента отката в
килобайтах (KB)
или мегабайтах (MB).
Это значение указывает Oracl'у идеальное
число экстентов,
которое сегмент отката должен поддерживать.
Если optimal
определено для сегмента отката, такой
объект будет освобождать пространство
когда заголовок сегмента отката
переместится из одного экстента в другой,
если текущий размер сегмента отката
превысит optimal
и если существуют соприкасающиеся соседние
неактивные экстенты. Рисунок 3 иллюстрирует
освобождение сегментов отката.
Рисунок 3.
|