Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
db-shpora.doc
Скачиваний:
14
Добавлен:
08.11.2018
Размер:
1.44 Mб
Скачать
  1. Блокировка ресурсов. Неявные и явные блокировки. Глубина детализации блокировки. Монопольная и коллективная блокировки

Блокировка может налагаться либо автоматически, по инициативе СУБД, либо по команде, которая передается СУБД прикладной программой или запросом пользователя. Блокировка, налагаемая СУБД, называется неявной блокиров­кой (implicit locks), а блокировка, налагаемая по команде, — явной блокировкой (explicit locks).

В предыдущем примере блокировка налагалась на строки данных. Однако не все типы блокировки налагаются на этом уровне. Одни СУБД предусматривают бло­кировку на уровне страницы, другие — на уровне таблицы, а третьи — на уровне базы данных. Размер блокируемого ресурса называется глубиной детализации блокировки (lock granularity). При малой глубине детализации СУБД легче справ­ляется с администрированием блокировки, но такие блокировки часто являются причиной конфликтов. Блокировки с большой глубиной детализации сложно ад­министрировать (СУБД приходится отслеживать и проверять гораздо больше деталей), но конфликты при этом менее часты.

Блокировки различаются также по типу. При монопольной блокировке (exclusive lock) блокируются все виды доступа к элементу. Ни одна другая транзакция не может читать или изменять данные. Коллективная блокировка (shared lock) защи­щает элемент от изменения, но не от чтения. То есть другие транзакции могут свободно читать данный элемент, если они не пытаются изменить его.

  1. Блокировка ресурсов: сериализуемые транзакции

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

Сериализуемость может быть достигнута несколькими способами. Один из способов — обработка транзакций с использованием двухфазной блокировки (two-phase locking). При этой стратегии транзакциям позволяется налагать блоки­ровки по мере необходимости, но как только первая блокировка снимается, данная транзакция уже не может наложить никаких других блокировок. Таким образом, транзакции имеют фазу нарастания (growing phase), на которой блокировки на­лагаются, и фазу сжатия (shrinking phase), на которой блокировки снимаются.

В ряде СУБД используется особая разновидность двухфазной блокировки. В этом случае блокировки налагаются на всем протяжении транзакции, но ни одна блокировка не освобождается, пока не будет выдана команда COMMIT (со­хранение) или ROLLBACK (откат, возврат к предыдущему состоянию). Эта страте­гия имеет более ограничительный характер, чем требуется для двухфазной бло­кировки, зато ее легче реализовать.

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

Рассмотрим ввод заказа с помощью представления ЗАКАЗ—ПОКУПАТЕЛЬ, бази­рующегося на таблицах ПОКУПАТЕЛЬ, ПРОДАВЕЦ и ЗАКАЗ. Чтобы гарантировать, что база данных не пострадает от аномалий, вызванных параллельной обработкой, транзакция ввода заказа налагает блокировки на таблицы ПОКУПАТЕЛЬ, ПРОДАВЕЦ и ЗАКАЗ по мере необходимости, производит все необходимые изменения в базе данных, а затем снимает блокировки.

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