12. Многовариантность данных по чтению в субд Oracle.
Для
реализации неблокирующего подхода в
СУБД Oracle
применяется
механизм
многовариантности данных. Этот
механизм обеспечивает:
согласованность
по чтению, которая
заключается в выдаче запросами
согласованных результатов на момент
начала их выполнения;
неблокируемые
запросы чтения данных
при выполнении другими транзакциями
операций изменения данных.
Многовариантность
достигается за счет поддержки в базе
данных различных версий одних и тех же
элементов данных. Для реализации этого
механизма каждой активизируемой
транзакции присваивается уникальный
системный номер SCN,
System
change
number.
Каждый
блок данных должен иметь одно из значений
SCN
-это
значение всегда совпадает с номером
последней транзакции, которая произвела
изменения данных в этом блоке. Ранние
версии каждого из блоков данных хранятся
в сегменте отката, и им соответствуют
системные номера SCN,
присвоенные
транзакциями, которые стартовали
раньше. При выполнении транзакции ее
системный номер сравнивается с номером
SCN
текущей
версии каждого из считываемых блоков.
Если номер транзакции больше либо равен
номеру текущей версии блока, то это
указывает, что после старта транзакции
обновление текущей версии блока не
производилось либо было выполнено этой
транзакцией, и, следовательно, необходимо
осуществлять считывание текущей версии.
В противном случае следует обратиться
к сегменту отката и выбрать версию
блока, у которой номер SCN
блока
является наиболее близким к системному
номеру транзакции.
Пример.
На рис. 6.10 представлена иллюстрация
механизма многовариантности данных
для транзакции, считывающей три блока
данных.
Рис.
6.10. Реализация механизма многовариантности
данных
Системные
номера текущих версий блоков 1 и 3
удовлетворяют условию на соответствие
системному номеру транзакции R1,
и эти блоки передаются в результирующий
набор данных. Системный номер SCN
2 текущей
версии блока данных 2 больше системного
номера транзакции SCNT.
Такое
соотношение между системными номерами
указывает на то, что в текущей версии
блока 2 были произведены изменения
данных транзакцией, которая стартовала
позже текущей транзакции, и, следовательно,
необходимо из сегмента отката выбрать
более раннюю версию блока данных 2.