Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Управление данными (пособие).pdf
Скачиваний:
280
Добавлен:
21.05.2015
Размер:
5.42 Mб
Скачать

175

14.5.Решение проблем параллелизма при помощи блокировок

Рассмотрим, как будут себя вести транзакции, вступающие в конфликт при доступе к данным, если они подчиняются приведенному выше протоколу доступа к данным.

Проблема потери результатов обновления

Две транзакции по очереди записывают некоторые данные в одну и ту же строку и фиксируют изменения.

Транзакция А

Время

Транзакция В

 

 

 

 

---

Блокирует кортеж P S-

t1

блокировкой

 

Чтение значения Р0 из кортежа P

t 2

---

---

 

t 3

Блокирует кортеж P S-блокировкой

 

(разрешена)

---

t 4

Чтение значения Р0 из кортежа P

Попытка X-блокировки кортежа Р

---

t 5

для его обновления отвергается

Попытка X-блокировки кортежа Р

Ожидание снятия блокировки с

t 6

кортежа Р

для его обновления отвергается

Ожидание…

t 5

Ожидание снятия блокировки с

 

кортежа Р

Ожидание…

t 6

Ожидание…

Ожидание…

Ожидание…

 

Как видно из приведенной схемы, обе транзакции успешно накладывают S-блокировки и получают доступ для чтения значения объекта Р. Для того, чтобы осуществить обновление объекта Р, транзакция А пытается наложить на него X-блокировку. Эта блокировка отвергается, т.к. объект Р уже заблокирован S-блокировкой, осуществленной транзакцией В. Транзакция А переходит в состояние ожидания до тех пор, пока транзакция В не освободит объект. Транзакция В, в свою очередь, также пытается для обновления значения объекта Р наложить на него X-блокировку. Эта блокировка также отвергается, так как объект Р уже заблокирован S-блокировкой транзакции А. Транзакция В

176

переходит в состояние ожидания, до тех пор пока объект Р не будет освобожден транзакцией А.

Врезультате обе транзакции находятся в состоянии ожидания друг друга

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

называемая тупиком (dead lock).

Проблема незафиксированной зависимости (чтение «грязных» данных, неаккуратное считывание)

Транзакция В изменяет данные в строке. После этого транзакция А читает измененные данные и работает с ними. Транзакция В откатывается и восстанавливает старые данные.

Транзакция А

Время

Транзакция В

 

 

 

---

Блокирует кортеж P S-блокировкой

t1

---

Чтение значения Р0 из кортежа P

t 2

---

 

t 3

Блокирует кортеж P X-блокировкой

 

(разрешена)

---

t 4

Запись значения Р1 в кортеж P

Попытка S-блокировки кортежа Р

---

t 5

для его обновления отвергается

Откат транзакции, т.е.

Ожидание…

t 6

 

восстановление значения Р0

 

кортежа P

 

 

(Блокировка объекта снимается)

Блокирует кортеж P S-блокировкой

t 7

---

(теперь разрешена)

---

Чтение значения Р0 из кортежа P

t 8

Работа с прочитанными данными Р0

---

t 9

---

---

t 10

Фиксация транзакции

---

t 11

Все правильно

 

 

 

Результат.

Работа транзакции А была приостановлена до окончания (отката) транзакции В. После этого транзакция А продолжила работу В обычном режиме и работала с правильными данными. Конфликт разрешен за счет

177

некоторого увеличения времени работы транзакции А (потрачено время на ожидание снятия блокировки транзакцией В).

Проблема несовместимого анализа. Неповторяемое считывание

Транзакция А дважды читает одну и ту же строку. Между этими чтениями вклинивается транзакция В, которая изменяет значения в строке.

Транзакция А

Время

Транзакция В

 

 

 

Блокирует кортеж P S-блокировкой

---

t1

Чтение значения Р0 из кортежа P

---

t 2

---

 

t 3

Попытка X-блокировки кортежа P

 

отвергается

---

t 4

Ожидание…

Повторное чтение значения Р0 из

Ожидание…

t 5

кортежа P

Ожидание…

Фиксация транзакции

t 6

(Блокировка объекта снимается)

 

---

t 7

Блокирует кортеж P X-блокировкой

---

(теперь она разрешена)

t 8

Запись значения Р1 в кортеж P

---

Фиксация транзакции

t 9

 

и снятие блокировки

Все правильно

 

 

 

Результат.

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

178

Фиктивные элементы (фантомы)

Транзакция А дважды выполняет выборку строк с одним и тем же условием. Между выборками вклинивается транзакция В, которая добавляет новую строку, удовлетворяющую условию отбора.

Транзакция А

Время

Транзакция В

 

 

 

Блокирует S-блокировкой кортежи,

---

t1

удовлетворяющие условию α

 

(заблокировано n строк)

---

Выборка кортежей, удовлетворяющих

t 2

условию α (выбрано n строк)

 

---

t 3

Вставка нового кортежа,

---

удовлетворяющего условию α

t 4

Фиксация транзакции

Блокирует S-блокировкой кортежи,

---

t 5

удовлетворяющие условию α

 

(заблокировано n+1 строка)

 

 

Выборка кортежей, удовлетворяющих

---

t 6

условию α (выбрано n+1 строк)

---

Фиксация транзакции

t 7

и снятие блокировок

 

Появились кортежи, которых

 

 

 

раньше не было

 

 

Результат.

Блокировка на уровне строк не решила проблему появления фиктивных элементов.