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

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

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

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

В литературных источниках доказывается, что любое расписание S двухфазных транзакций является сериализуемыми.

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

Пример. Имеется расписание представленное на рис.3.13. 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. Расписание транзакций

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

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

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

10.10. Модели с блокировками для чтения и записи

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

1.    Блокировки для чтения. RLOCK A (READ-LOCK A), что препятствует записи нового значения А любой другой транзакций во время чтения А транзакций Т. Однако блокировку А для чтения может одновременно установить любое число транзакций. 2.    Блокировки для записи. WLOCK A (WRITE-LOCK). При блокировках для записи никакая другая транзакция не может установить для этого элемента блокировку для чтения, ни блокировку для записи. И блокировки для чтения, и блокировки для записи снимаются операторами UNLOCK (разблокировать). Два расписания эквивалентны, если 1.    они продуцируют одно и то же значения для каждого элемента; 2.    каждая блокировка для чтения, применяемая данной транзакцией, встречается в обоих расписаниях, когда блокируемый документ имеет одно и то же значение. В системе поддерживается два типа блокировок:

1.    Х – блокировка (XLOCK – eXclusive lock) – блокировка без взаимного доступа. WLOCK обозначает то же самое.

2.    S – блокировка (SLOCK – Shared lock) – блокировка с взаимным доступом. RLOCK обозначает то же самое.

X – блокировка записи S – блокировка чтения.

1.    Если транзакция Т блокирует кортеж А (Х-блокировка), то запрос любой другой транзакции к А будет отменён.

2.    Если транзакция Т, блокирующая элемент А (S – блокировка), то ·    запрос со стороны транзакции Т2 на Х-блокировку будет отвергнут ·    запрос со строки Т2 на S-блокировку будет принят  Эти правила можно представить в виде матрицы совместимости (рис.10.14). Запрос транзакций Т1 и Т2 к одному элементу А. N-означает конфликтную ситуацию. Т2 – находится в состоянии ожидания. Y – полная совместимость, «–» - отсутствие блокировок.

Рис.10.14. Матрица совместимости транзакций

Проверка сериализуемости: Алгоритм 2. Проверка сериализуемости расписаний с блокировками для чтения/записи. Входные данные. Расписание S для совокупности транзакций T1,…,Tk. Выходные данные. Получение ответа, является ли S сериализуемым. Метод. Строим граф предшествованый G следующим образом. Узлы, как и прежде, соответствуют транзакциям. Дуги определяются следующими правилами: 1.    Пусть в S транзакция Ti устанавливает блокировку элемента А для чтения, а Tj – следующая за ней транзакция (если она существует) – устанавливает блокировку А для записи. Тогда строим дугу из Ti  в Tj.   2.    Пусть транзакция Ti  в S блокирует А для записи, а Tj – следующая за ней (если, конечно, такая существует) транзакция – устанавливает блокировку А для записи. Тогда строим дугу Ti -> Tj. 3.    Пусть далее Tm – какая-либо транзакция, блокирующая А для чтения после того, как Ti снимает свою блокировку для записи, но перед тем, как Tj устанавливает блокировку А для записи (если Tj не существует, то Tm – любая транзакция, которая блокирует А для чтения после того, как Ti разблокирует его. Тогда строим дугу Ti -> Tm.      Если граф G имеет циклы, то S не сериализуемо. Если же G ацикличен, то любая его топологическая сортировка определит последовательный порядок для транзакций.         Процесс топологической сортировки определяется следующим образом. Из ацикличности G следует, что в нём существует узел Ti, который не имеет входящих дуг. Занесём Ti  в список, удалив его из графа. Процесс повторяется до тех пор, пока в графе не останется узлов. Порядок перечисления узлов в списке даёт последовательный порядок транзакций.

Пример: Показано расписание 4-х транзакций. (1) – – – – – – – – – – – – – WLOCK A  (2) – – – – – – – – – – – – – – – – – – – – – WLOCK B  (3) – – – – – – – – – – – – – UNLOCK A  (4) RLOCK A  (5)                                                              UNLOCK B  (6)                                        WLOCK B  (7)                       RLOCK A  (8) UNLOCK B  (9) WLOCK B  (10)                     UNLOCK A  (11) UNLOCK A  (12) – – – – – –                                          WLOCK A   (13) UNLOCK B  (14) – – – – – – – RLOCK B  (15) – – – – – – – – – – – – – – – – – – – – UNLOCK A  (16) – – – – – – – UNLOCK B  Т1 Т2 Т3 Т4         Рис.10.15. Расписание транзакций

Первый оператор UNLOCK A выполняется на шаге 3, когда T3 снимает свою блокировку элемента А для записи. За шагом 3 следует блокировка А для чтения транзакциями Т1 и Т2 (шаги 4 и 7) и блокировка этого элемента для записи транзакцией Т4 на шаге (12). Таким образом Т1, Т2 и Т4 должны следовать за Т3 и мы строим дуги из Т3 в эти узлы.

Рис.10.16. Граф проверки сериализуемости

В связи с тем, что Т4 снимает блокировку В для записи на шаге 5, а следующую блокировку В для записи устанавливает Т3 строится дуга из Т4 и Т3. Образуется цикл, свидетельствующий о том, что расписание не является сериализуемым.     Как и в модели, приводимой ранее, достаточной гарантией сериализуемости является двухфазный протокол, в соответствии с которым установление блокировок для чтения и записи предшествует всем операциям разблокирования.

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