Обзор данных отката
Данные отката (undo data) это информация необходимя для отмены любой команды DML. Часто можно встретить понятие rollback data, но старайтесь избегать использования этого термина. В старых версиях Oracle undo data и rollback data были взаимозаменяемы, но начиная с версии 9i они стали разными: их назначение одинаково но управление ими различно. Когда транзакция изменяет данные, версия данных до обновления записывается в rollback сегмента или в undo сегмент. Разница огромная. Сегменты rollback всё ещё могут существовать в БД версии 11g, но начиная с версии 9i Oracle рекомендует использовать undo сегменты – rollback сегменты существуют только для обратной совместимости. Отмена транзакции означает использование данных из сегмента undo для создания образа данных, какими они были до транзакции. Это обычно делается автоматически для прохождения ACID теста, но возможность исользования flashback запросов показывает мощь механизма undo позволяя получать данные из БД такими какими они были какое-то время назад. И конечно любой пользователь может использовать команду ROLLBACK для отмены DML команд которые были выполнены но не подтверждены.
ACID тест требует, во первых, сохранения исходного состояния данных в таком виде, чтобы его можно было восстановить путём отмены неподтвержденных транзакций – неважно автоматически в случае ошибки или по запросу команды ROLLBACK. Такой вид отмены постоянный и доступный для всех пользователей. Во вторых, для согласованности, база данных должна иметь возможность предоставить данные по запросу в том виде, в каком они были на момент начала запроса. Серверный процесс выполняющий запрос будет использовать undo сегменты для создания согласованного образа (read-consistent image) блоков используемых в запросе, если они изменились после начала запроса. Этот тип отмены изменений временный и видимый только той сессии которая выполняет запрос. В третьих, сегменты undo также используются для изоляции транзакций. Это самый сложные способ использования данных undo. Принцип изоляции гласит что транзакции не могут зависить от любой другой незавершённой транзакции. Как результат такого правила, даже в мультипользовательской базе данных в которой выполняется много транзакций одновременно, конечный результат должен быть таким, как будто бы транзакции выполнялись одна за другой. Использование данных undo в сочетании с механизмом блокировок гаранитурует изоляцию транзакций: невозможность несовместимых транзакций. Даже если несколько транзакций работали параллельно, принцип изоляции требует чтобы конечный результат был таким, как будто транзакции выполнялись последовательно.
Exam tip
Использование сегментов undo несовместимо с использование сегментов rollback: может быть либо одно либо другое в зависимости от настроек параметра UNDO_MANAGEMENT