Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СУБД Oracle / Лекции / Лек_ORAC / Lfg / Алгоритмы совместного доступа к базам данных.doc
Скачиваний:
59
Добавлен:
16.04.2013
Размер:
124.93 Кб
Скачать

Повышение блокировок

Повышение блокировок (lock escalation) —это метод, применяемый на многих серверах баз данных для снижения расхода ресурсов системы на блокирование данных. Для примера рассмотрим сервер базы данных, блокирующий табличные данные на уровне строк. После того как транзакция устанавливает определенное число строчных блокировок для таблицы, сервер может преобразовать несколько блокировок на уровне строк в одну блокировку табличного уровня. Это позволяет сэкономить ресурсы системы, необходимые для блокирования данных таблицы.

На первый взгляд может показаться, что повышение блокировок весьма удобно и способствует более рациональному использованию ресурсов системы. Однако повышение блокировок может стать причиной взаимоблокировок. В Oracleповышение блокировок не применяется, и тупики обычно возникают из-за плохой структуры транзакций.

Запросы и блокирование

В предыдущих разделах этой части не упоминались типы блокировок, которые устанавливаются, если транзакция обращается к таблице с запросом. Дело в том, что Oracleне блокирует строки или таблицы при считывании данных во время запроса. Однако для согласованности чтения данных во время запроса без блокирования вOracleиспользуется уникальный алгоритм многовариантности, выполняющий повторяемое чтение данных. Более подробно об алгоритме многовариантностиOracleрассказано ниже в разделе "Многовариантность".

Блокировки ddl

Выше было рассказано о блокировках, автоматически используемых в Oracleдля защиты операцийDML:INSERT,UPDATEиDELETE. Кроме того, вOracleданные блокируются автоматически при вы­полнении таких операцийDDL, какCREATE,ALTERиDROP. Далее будет рассказано, в каких случаях устанавливаются разделяемые и исключающие блокировкиDULобъектов базы данных.

Каждая операция DDLвыполняется внутри своей транзакции. Поэтому транзакция устанавливает и удерживает необходимые блокировкиDDLтолько во время выполнения собственно операцииDDL.

Исключающие блокировки ddl

Для выполнения операторов DDL, создающих, изменяющих и удаляющих объекты базы данных, требуются исключающие блокировкиDDL(exclusive DDL locks)соответствующих объектов. Например, при выполнении оператораALTERTABLE, если к таблице добавляется новое ограничение целостности, транзакция устанавливает исключающую блокировкуDDLэтой таблицы. При этом другие пользователи не могут модифицировать или удалить таблицу до тех пор, пока операторALTERне будет выполнен.

Разделяемые блокировки ddl

При выполнении некоторых операторов DDLмогут устанавливаться разделяемые блокировкиDDLобъектов базы данных. Такие блокировки обычно нужны операторамDDL, с помощью которых между объектами базы данных устанавливаются различные взаимосвязи. Предположим, например, что создается новый модуль, при этом процедуры и функциимодуля ссылаются на множество различных таблиц базы данных. При создании модуля транзакция устанавливает исключающую блокировкуDDLмодуля и разделяемую блокировкуDDLтаблиц, на которые происходит ссылка. Разделяемые блокировкиDDLне позволяют другим транзакциям устанавливать исключающие блокировки этих таблиц для их изменения или удаления до тех пор, пока не закончится компиляция модуля. Однако разделяемые блокировки не устраняют возможности того, что другие транзакции также установят разделяемые блокировкиDDLтаблиц, на которые производится ссылка, например, для создания хранимых процедур, использующих эти таблицы.