Ооп бд объектно-ориентированная база данных

Вид материалаДокументы

Содержание


10. Средства блокировки в Оракл. Настройка блокировки.
Блокировки DML
Блокировки DDL
Исключительные блокировки.
Разделяемые блокировки.
Нарушаемые блокировки разбора.
Подобный материал:
1   2   3   4   5   6   7   8   9   ...   17

10. Средства блокировки в Оракл. Настройка блокировки.


В ORACLE автоматически применяются следующие основные классы блокировок:
  • Блокировки данных (DML-блокировка, то есть блокировка на уровне операторов языка манипулирования данными) применяется для таблиц и используется для защиты данных (для обеспечения целостности данных). К этому типу относятся блокировки строки данных или блокировка на уровне таблицы, затрагивающая все строки таблицы. Генерируются при выполнении операторов insert, delete, update, select for update.
  • Блокировки словаря (DDL-блокировка, то есть блокировка на уровне операторов определения данных) используется для защиты структуры объектов. Генерируется при выполнении операторов create, alter.
  • Внутренняя блокировка и защелка (enqueues, internal locks, latchs)защищают внутреннюю структуру данных. Используются для блокировки, например, библиотечного кеша.

Блокировки DML


Блокировки таблиц ( TM) применяются, если в транзакции выдается один из операторов insert, delete, update, select for update, lock table. Таблицы блокируются ораклом, чтобы зарезервировать доступ к таблице и предотвратить конкуренцию между операторами DDL за таблицу. Проще говоря, блокировка таблиц (TM) позволяет быть уверенным, что структура таблицы не изменится при изменении её содержимого.

Блокировки TM могут быть в следующих режимах (lmode) : 3- row exclusive монопольная блокировка строки (RX) при выполнении операторов insert, delete, update; 2- row share разделяемая блокировка строки (RS) при выполнении select for update; 6 – exclusive монопольная блокировка ( X) при выполнении lock table.

Блокировка транзакций TX устанавливается при выполнении следующих операторов insert, delete, update, select for update. Блокировки транзакций работают только в режиме (lmode) - 6 exclusive (X) монопольная блокировка. Блокировки транзакций всегда осуществляются на уровне строк: блокируется строка и предотвращается изменение строки другими транзакциями до тех пор, пока не буде выполнен откат текущей транзакции или транзакция не будет зафиксирована. Чтобы была установлена блокировка TX, сначала устанавливается блокировка TM для таблицы в режиме 3 (RX). Затем устанавливается блокировка TX в режиме 6 (X). Блокировка TX не будет установлена, если другая транзакция установила блокировку TX на эту же строку.

Блокировки могут быть еще в режиме 4 (разделяемая блокировка таблицы share mode, генерируется, например, оператором lock table <…> in share mode) и 5 (разделяемая блокировка таблицы и монопольная блокировка строк share row exclusive; генерируется, например, оператором lock table <…..> in share row exclusive mode). Но эти режимы встречаются крайне редко.

Следующая таблица важна для понимания разницы в режимах блокировок: Если один процесс “держит блокировку”, и другой процесс пытается получить”блокировку” на это этот же ресурс- он получит результат в соответствии с этой таблице:



А теперь немножко про так называемое «преобразование блокировок» или «распространение блокировок». Что это за механизм?

Блокировка таблицы TM преобразуется из низкого (лояльного) уровня (режим 2) в более высокий (жесткий) уровень (режим 3).

В отличие от других баз данных , база данных ORACLE никогда не переводит блокировки на уровень таблицы , если заблокирована основная часть строк в таблице. То есть в ORACLE никогда не применяется эскалация блокировок (увеличение размера блокируемых объектов). Это связано с тем, что ORACLE нет необходимости уменьшать нагрузку на диспетчер блокировок баз данных, так как нет традиционного диспетчера блокировок. То есть, нет диспетчера, поддерживающего список со всеми строками, заблокированными в базе. В ORACLE блокировки хранятся как атрибут данных (см. описаниессылка скрыта) . У Тома Кайта есть очень красивое объяснение, как организованы блокировки в ORACLE. Привожу выдержку:

Сервер Oracle поступает примерно так:
  • Находит адрес строки, которую необходимо заблокировать.
  • Переходит на эту строку.
  • Блокирует ее (ожидая снятия блокировки, если она уже заблокирована и при этом не используется опция NOWAIT).

Блокировки DDL


Такие блокировки устанавливаются на объект автоматически при выполнении DDL –команд для защиты от других сеансов. Есть три типа DDL-блокировок:
  • Исключительные блокировки. Запрещают другим сеансам устанавливать DDL-блокировки и TM-блокировки. Это означает, что в процессе выполнения DDL-оператора можно только выбирать данные из таблицы, но нельзя изменять данные. Преобладающее большинство операторов DDL устанавливают именно такую блокировку. Но есть приятные исключения: команда create index ind1 on t1(pole) online сгенерирует на таблицу TM –блокировку в режиме 2 (ROW SHARE). Это означает, что другие сеансы не смогут изменить структуру таблицы, но данные в этой таблице менять можно. Когда индекс будет создан, то будут учтены затем и изменения в данных таблицы проведенных во время создания индекса.
  • Разделяемые блокировки. При таких блокировках защищается структура объекта от других сеансов, но данные можно изменять. Устанавливаются на объекты, от которых зависят скомпилированные хранимые объекты (процедуры, представления и т.д.) Например, для выполнения команды create view proba as select * from test. На таблицу test будет установлена именно такая блокировка. Данные в ней менять можно, но нельзя менять структуру.
  • Нарушаемые блокировки разбора.Они позволяют объекту, например плану запроса, хранящемуся в кеше разделяемого пула, зарегистрировать свою зависимость от другого объекта. При выполнении оператора DDL, над объектом, заблокированным таким образом, сервер Oracle пометит его как недействительный. Но DDL-оператор будет выполнен без проблем.

Есть представление DBA_DDL_LOCKS для просмотра действующих блокировок. Особо хочу обратить внимание на значение столбца owner. В этом столбце прописан владелец объекта, а не владелец блокировки. Это представление весьма полезно для разработчиков приложений для выявления блокирующих сеансов. Например, если вы не можете откомпилировать процедуру или выполнить оператор grant, то в этом представлении можно увидеть , что необходимый объект выполняется другим сеансом.