Проблема потери результатов обновления
Решение проблем параллелизма при помощи блокировок
Рассмотрим, как будут себя вести транзакции, вступающие в конфликт при доступе к данным, если они подчиняются протоколу доступа к данным.
Две транзакции по очереди записывают некоторые данные в одну и ту же строку и фиксируют изменения.
Транзакция 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-блокировка ![]() | ![]() | --- |
Чтение ![]() | ![]() | --- |
Работа с прочитанными данными ![]() | ![]() | --- |
--- | ![]() | --- |
Фиксация транзакции | ![]() | --- |
Все правильно |
Результат. Транзакция A притормозилась до окончания (отката) транзакции B. После этого транзакция A продолжила работу в обычном режиме и работала с правильными данными. Конфликт разрешен за счет некоторого увеличения времени работы транзакции A (потрачено время на ожидание снятия блокировки транзакцией B).