Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
baz_dan / Главы8-12.doc
Скачиваний:
64
Добавлен:
12.03.2015
Размер:
1.67 Mб
Скачать

10.9.1. Протоколы и расписания

        Как было показано выше, произвольные транзакции при их параллельном исполнении могут приводить к бесконечному ожиданию, тупиковым ситуациям и несериализуемому расписанию.   Для исключения подобных ситуаций имеются два инструмента. ·    1-й планировщик - часть системы базы данных, которая служит арбитром между конфликтующими запросами. Планировщик может основываться на стратегии "первым вошёл - первым обслуживается" исключения бесконечного ожидания. Планировщик может также справляться с тупиками и несериализуемостью при помощи рестарта одной или более транзакций.

·  2-й подход – использование протоколов. Протокол представляет собой введение ограничений на последовательность шагов, которые может выполнять транзакция. Например, протоколом является исключающая тупики стратегия запрашивания блокировок элементов в некотором фиксированном порядке.

10.9.2. Модель транзакции

        Рассмотрим простейшую модель транзакции, которая, однако, позволяет говорить о сериализуемости. В этой модели транзакция рассматривается как последовательность операторов блокирования и разблокирования

(LOCK и UNLOCK).             Сопоставляя каждой паре шагов LOCK A и последующего за ним UNLOCK A однозначную функцию f, можно более формально рассмотреть поведение транзакций. Отметим, что для данного элемента А транзакция может иметь более одной такой пары, то есть мы можем блокировать и разблокировать один и тот же элемент более одного раза. Пусть А0 – начальное значение А до исполнения любых транзакций. Значения, которые может принимать А, являются тогда формулами вида: f1f2…fn (А0) где fi – функции, ассоциируемые с парами шагов LOCK A – UNLOCK A соответствующих транзакций. 

Блокировка: LOCK A Разблокировка: UNLOCK A fn … f3 f2 f1 (A)

Пример: На рис. 10.10 приведены три транзакции и функции, ассоциированные с каждой парой LOCK A – UNLOCK A соответствующих транзакций.

Рис.10.10. Модели транзакций

На рис.10.11 показано возможное расписание этих транзакций и результат их воздействия на элементы A, B, C.

Рис.10.11. Расписание транзакций:

Является ли данное расписание сериализуемым. Пусть Т1 предшествует Т2, тогда

  1. Т1Т2: Т1 предшествует Т2. Тогда конечным значением В было бы  f3(f2(B0)), а не f2(f3(B0)

  2. Если Т2Т1: Т2  предшествует Т1. Не может быть f6 (f1(f5(A0))).

3) Т2Т3Т1: Т2  предшествует Т3 и Т1, Т3 предшествует Т1. Не может быть   f1(f7(f5)). 4)    Т3Т2Т1: Т2  предшествует Т3 и Т2, Т2 предшествует Т1. Не может быть       f1(f5(f7)).         Для этого анализируется предусмотренный в расписании порядок, в котором различные транзакции блокируют данный элемент. Этот порядок должен соответствовать гипотетическому эквивалентному последовательному расписанию транзакций. Если для двух различных элементов необходимо исполнение каких-либо двух транзакций в разном порядке, то мы имеем парадокс, поскольку оба таких порядка не могут соответствовать  одному последовательному расписанию. Выявление этой ситуации может быть сформулировано как задача обнаружения циклов в ориентированном графе. Формальное описание метода её решения даёт следующий алгоритм.         Алгоритм 1. Проверка сериализуемости расписания.

Входные данные. Расписание S для совокупности транзакций T1, …, Tk.

Метод. Построим ориентированный граф G, называемый графом предшествований, узлы которого соответствуют транзакциям.        Определим дуги графа G. Пусть S есть a1;a2;…,an, где ai – действие вида Tj: LOCK Am или Tj: UNLOCK Am и Tj указывает транзакцию, к которой относится данный шаг. Для ai имеющего вид Tj: UNLOCK Am ищем следующее за ним действие ap вида Ts: LOCK Am. Если оно существует, то строим дугу от Tj к Ts. Интуитивный смысл этой дуги заключается в том, что в любом последовательном расписании, эквивалентном S, Tj должно предшествовать Ts..         Если в графе G имеется цикл, то S-не сериализуемо. При отсутствии циклов находим такой линейный порядок транзакций, чтобы Ti предшествовала бы Tj всякий раз, когда существует дуга Ti -> Tj. Это всегда может быть сделано при помощи процесса так называемой топологической сортировки, определяемого следующим образом. Из ациклического G следует, что в нём существует некоторый узел Tj, который не имеет входящих дуг. Запишем Tj в список, удалив его из графа. Процесс повторяется до тех пор, пока в графе не останется узлов. Порядок перечисления узлов в списке даёт последовательный порядок транзакций.

Пример. Рассмотрим расписание, приведенное на рис.10.11. В графе G, изображенном на рис.10.12 имеются узлы Т1, Т2, и Т3.

Рис.10.12. Граф предшествований для транзакций

расписания на рис.10.11.

Поскольку в графе существует цикл, расписание представленное на рис.10.11 не является сериализуемым.

Соседние файлы в папке baz_dan