Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры_БД.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.03 Mб
Скачать

Оптимистическая и пессимистическая блокировки

Блокировки могут налагаться двумя основными стилями. При оптимистической блокировке (optimistic locking) делается предположение, что конфликта не про­изойдет. Данные считываются, транзакция обрабатывается, производятся обнов­ления, а после этого проверяется, не возник ли конфликт. Если нет, транзакция завершается. Если да, транзакция повторяется до тех пор, пока не сможет успешно завершиться. При пессимистической блокировке (pessimistic locking) предполага­ется, что конфликт обязательно произойдет. Сначала налагаются блокировки, затем обрабатывается транзакция, а после этого блокировки снимаются.

Листинги 1, 2 и 3 демонстрируют оба стиля наложения блокировок для транзакции, которая уменьшает количество карандашей в таблице ТОВАР на пять штук. В листинге 1 изображена оптимистическая блокировка. Сначала дан­ные считываются, и текущее количество карандашей сохраняется в переменной СтароеКоличество. Затем обрабатывается транзакция, и в предположении, что все прошло успешно, налагается блокировка на таблицу ТОВАР. Эта блокировка мо­жет затрагивать только строку карандашей, а может быть, глубина детализации будет и меньшей. В любом случае, выполняется SQL-оператор, обновляющий строку карандашей, с условием WHERE Количество = СтароеКоличество. Если ника­кая другая транзакция не изменила атрибут Количество в строке карандашей, то­гда результат оператора UPDATE будет успешным. Если какая-то другая транзак­ция изменила значения атрибута Количество в строке карандашей, выполнение оператора UPDATE будет неудачным, и транзакцию придется повторить.

Листинг 1. Оптимистическая блокировка

SELECT ТОВАР.Название, ТОВАР.Количество

FROM ТОВАР

WHERE ТОВАР.Название ='Карандаш'

СтароеКоличество = ТОВАР.Количество

Set НовоеКоличество = ТОВАР.Количество - 5

{обработка транзакции - если НовоеКоличество < 0, то генерируется исключение, и т. д. Если все в порядке:}

LOCK ТОВАР

UPDATE ТОВАР

SET ТОВАР.Количество = НовоеКоличество

WHERE ТОВАР.Название = 'Карандаш'

AND ТОВАР.Количество = СтароеКоличество

UNLOCK ТОВАР

{проверяем, было ли обновление успешным; если нет, повторяем транзакцию}

В листинге 2 изображена логика той же самой транзакции, но с использова­нием пессимистической блокировки. Здесь еще до начала работы на таблицу ТОВАР налагается блокировка (с некоторой глубиной детализации). Затем счи­тываются значения, обрабатывается транзакция, выполняется оператор UPDATE, и таблица ТОВАР разблокируется.

Преимущество оптимистической блокировки состоит в том, что она налагается только после обработки транзакции. Таким образом, блокировка удерживается в течение более короткого времени, чем при пессимистической стратегии. Если транзакция является сложной или клиент – медлительным (например, имеются задержки при передаче, клиент занят другой работой, пользователь уходит попить кофе или выключает компьютер, не выйдя из браузера), то блокировка будет удерживаться в течение значительно меньшего промежутка времени. Это преимущество будет еще более важно, если глубина детализации блокировки ма­ла – скажем, вся таблица ПРОДУКТ.

Листинг 2. Пессимистическая блокировка

LOCK ТОВАР

SELECT ТОВАР.Название, ТОВАР.Количество

FROM ТОВАР

WHERE ТОВАР.Название ='Карандаш'

Set НовоеКоличество = ТОВАР.Количество - 5

{обработка транзакции - если НовоеКоличество < 0, генерируется исключение, и т. д. Если все в порядке:}

UPDATE ТОВАР

SET ТОВАР.Количество = НовоеКоличество

WHERE ТОВАР.Название = 'Карандаш'

UNLOCK ТОВАР

{проверка на успешность обновления не требуется}

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

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

42, БЛОКИРОВКА РЕСУРСОВ: ОБЪЯВЛЕНИЕ ХАРАКТЕРИСТИК БЛОКИРОВКИ.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]