Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на СУБД.docx
Скачиваний:
9
Добавлен:
30.08.2019
Размер:
146.57 Кб
Скачать

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

Проанализируем, поведение транзакций, вступающих в конфликт при доступе к одним и тем же данным.

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

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

Время

Транзакция A

Транзакция B

S-блокировка

- доступна

---

Чтение

---

---

S-блокировка

- доступна

---

Чтение

X-блокировка

- недоступна

---

Ожидание…

X-блокировка

- недоступна

Ожидание…

Ожидание…

 

Ожидание…

Ожидание…

Обе транзакции успешно накладывают S-блокировки и читают объект . Транзакция A пытается наложить X-блокирокировку для обновления объекта . Блокировка отвергается, т.к. объект уже S-заблокирован транзакцией B. Транзакция A переходит в состояние ожидания до тех пор, пока транзакция B не освободит объект. Транзакция B, в свою очередь, пытается наложить X-блокирокировку для обновления объекта . Блокировка отвергается, т.к. объект уже S-заблокирован транзакцией A. Транзакция B переходит в состояние ожидания до тех пор, пока транзакция A не освободит объект.

Результат. Обе транзакции ожидают друг друга и не могут продолжаться. Возникла ситуация тупика (взаимоблокировки).

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

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

Время

Транзакция A

Транзакция B

---

S-блокировка

- доступна

---

Чтение

---

X-блокировка

- доступна

---

Запись

S-блокировка

- недоступна

---

Ожидание…

Откат транзакции

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

S-блокировка

- доступна

---

Чтение

---

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

---

---

---

COMMIT

---

 

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

 

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

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

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

Время

Транзакция A

Транзакция B

S-блокировка

- доступна

---

Чтение

---

---

X-блокировка

- недоступна

---

Ожидание…

Повторное чтение

Ожидание…

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

Ожидание…

---

X-блокировка

- доступна

---

Запись

---

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

 

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

 

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