Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК по СРОД-10-12.doc
Скачиваний:
10
Добавлен:
13.11.2018
Размер:
2.55 Mб
Скачать

3.5. Расписание транзакций Последовательное исполнение транзакции при использовании блокировок элементов замедляет процесс работы с бд, хотя и работает правильно. Т1: lock a; unlock a;

---------------------------------------------------------T2:LOCK A; UNLOCK A; 

Будем называть расписанием для транзакций порядок, в котором выполняются элементарные шаги этих транзакций (блокировка, чтение и т.д.). Последовательность элементарных шагов, выполняемых транзакцией, называется расписанием.

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

Пример 3.4. Рассмотрим, например, следующие две транзакции, которые могут быть частью бухгалтерской операции по переводу денежных средств с одного счёта на другой. Т1: READ A; A:=A-10; WRITE A; READ B; B:=B+10; WRITE B;  T2: READ B; B:=B-20; WRITE B; READ C; C:=C+20; WRITE C;  Понятно, что любое последовательное расписание обладает свойством постоянства суммы A+B+C. Пример расписания: А+В+С  

Последовательное:

      Т1                                      Т2  READ A                          A=A-10                          WRITE A                      READ B                           B=B+10                          WRITE B                                                                                                                            READ B                                               B=B-20                                             WRITE B                                             READ C                                               C=C+20                                               WRITE C Сериализуемое: Т1                                                                    Т2 READ A                                                                  

  READ B A=A-10                                                                    

B=B-20 WRITE A                                                                  

WRITE B READ B                                                                    

READ C B=B+10                                                                    

C=C+20 WRITE B                                                                 

WRITE C Несериализуемое:

Т1                                                                       Т2 READ A A=A-10                                                                       READ B WRITE A                                                                       B=B-20 READ B                                                                      WRITE B B=B+10                                                                        READ C WRITE B                                                                        C=C+20                                                                        WRITE C         Рис.3.9. Расписания транзакций

Отметим, что в последнем случае величина  B увеличивается, а не уменьшается на 10 в силу того, что Т1 читает В прежде, чем Т2 записывает новые уменьшенные значения В. Предотвратить это сложно.  

В случае, когда допускаются произвольные операции с элементами невозможно проверить, дают ли два расписания одинаковый результат при всех начальных значениях элементов. На практике делаются некоторые упрощающие предположения относительно операций, выполняемых над элементами. Удобно предположить, в частности, что одинаковые их значения можно получить только при одной и той же последовательности операций. Поэтому нельзя считать, что (А+10)-20 и (А+20)-30 продуцируют одни и те же значения. Игнорируя алгебраические свойства арифметики, мы совершаем лишь «нефатальные» ошибки. Но зато расписание никогда не рассматривается как сериализуемое, если оно не является таким («фатальная» ошибка).         Нефатальные ошибки могут исключить некоторые параллельные операции и тем самым сделать систему более медленной. Однако в отличие от фатальных ошибок, при этом никогда не могут быть получены некорректные результаты.

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

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

·  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 (A0) Пример 3.5. На рис. 3.10 приведены три транзакции и функции, ассоциированные с каждой парой LOCK A – UNLOCK A соответствующих транзакций.

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

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

Рис.3.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 в список, удалив его из графа. Процесс повторяется до тех пор, пока в графе не останется узлов. Порядок перечисления узлов в списке даёт последовательный порядок транзакций.

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

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

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

Протокол, гарантирующий сериализуемость

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

Например, на рис.3.10 транзакции T1 и T3 – двухфазные, а T2 – нет.

Утверждение. Любое расписание S двухфазных транзакций является сериализуемыми. Доказательство в книге Дж.Ульмана. «Основы систем БД».

В некотором смысле двухфазный протокол – наилучший среди реально возможных расписаний. Можно показать, что для любой транзакции T1, не являющейся двухфазной, найдётся какая-либо транзакция T2, совместно с которой T1 сможет выполняться в несериализуемом расписании. Пусть транзакция T1 – не двухфазная. Тогда в T1 существует шаг UNLOCK A, предшествующий шагу LOCK B. Пусть T2, имеет вид T2: LOCK A; LOCK B; UNLOCK A; UNLOCK B;    Легко видеть, что расписание на рис.3.13 не сериализуемо, поскольку обработка А требует, чтобы Т1 предшествовала Т2, в то время как обработка В требует обратного порядка (см. рис. 3.14 - граф предшествований).

1 Т1:LOCK A             2 T1:UNLOCK A       | 3 T2:LOCK A              4 T2:LOCK B                                                5 T2:UNLOCK A                                                

6 T2:UNLOCK B                                          7 T1:LOCK B                                                 8 T1:UNLOCK B                            Рис.3.13. Расписание транзакций

Рис.3.14. Граф предшествований.

Так как в графе существует цикл, расписание не сериализуемо

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