20 апреля 2011 г.

oracle: блокировки (locks), защёлки (latches), enqueues

Блокировки 
Типы блокировок
Где хранится информация о блокировках? ITL, INITRANS, MAXTRANS 
Выполнение блокировок с помощью защелок 

Принципы блокирования в СУБД Oracle. 


Разница между блокировками и защёлками.

Защелка (latch) – устанавливается, если кто-то работает с определенным участком памяти, и, как следствие, никто другой теперь в этот участок не попадет.

Блокировка – никого не допускает к строкам таблицы, если Вы меняете ее.

Блокировка реализуется с помощью защёлки 
Мы работаем с записью. Она уже находится в буфере в SGA. Запись эту нужно заблокировать, чтобы никакая другая сессия не заблокировала ее.

Наш серверный процесс вешает защелку на буфер с записью, читает буфер, находит нужную запись, ставит отметочку о том, что эта запись заблокирована нами. Таким образом, блокировка создана. Снимаем защелку. Работаем с записью.

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



Типы блокировок

0 - none
1 - null (NULL)
2 - row-S (SS) разделяемая блокировка строки (RS) при выполнении select for update;
3 - row-X (SX) монопольная блокировка строки (RX) при выполнении операторов insert, delete, update;
4 - share (S) разделяемая блокировка таблицы share mode, генерируется, например, оператором lock table <…> in share mode;
5 - S/Row-X (SSX) (разделяемая блокировка таблицы и монопольная блокировка строк share row exclusive; генерируется, например, оператором lock table <…..> in share row exclusive mode;
6 - exclusive (X) монопольная блокировка ( X) при выполнении lock table.

Режимы  4 - share (S) и 5 - S/Row-X (SSX) встречаются крайне редко.



Блокировки DML


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

TM - блокировки очерёдности DML
применяются, если в транзакции выдается один из операторов 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. 

На рисунке показаны режимы блокировки таблиц и операции, которые эти блокировки разрешают и запрещают

Следующий рисунок показывает, что будет если один процесс держит блокировку, а второй пытается её получить на один и тот же ресурс:



Блокировки DDL 


Exclusive DDL locks(исключительные блокировки): These prevent other sessions from gaining a DDL lock or TM (DML) lock themselves. This means that you may query a table during a DDL operation, but you may not modify it in any way. (Предотвращают установку DDL блокировок или TM(DML) блокировок другими сеансами. Можно запрашивать таблицу, но нельзя её изменять ).

Share DDL locks (разделяемые блокировки): These protect the structure of the referenced object against modification by other sessions, but allow modifications to the data.

Breakable parse locks (нарушаемые блокировки разбора): These allow an object, such as a query plan cached in the shared pool, to register its reliance on some other object. If you perform DDL against that object, Oracle will review the list of objects that have registered their dependence and invalidate them. Hence, these locks are breakable—they do not prevent the DDL from occurring.
( Они позволяют объекту, например плану запроса, хранящемуся в кэше разделяемого пула, зарегистрировать свою зависимость от другого объекта. При выполнении оператора DDL, затрагивающего заблокированный таким образом объект, сервер Oracle получает список объектов, зарегистрировавших свою зависимость, и помечает их как недействительные. Вот почему эти блокировки — "нарушаемые": они не предотвращают выполнение операторов DDL ).


Latches (защёлки)
Защелки — это блокировки, удерживаемые в течение очень непродолжительного времени, достаточного, например, для изменения структуры данных в памяти. Они используются для защиты определенных структур памяти, например буферного кэша или библиотечного кэша в разделяемом пуле.
Защелки обычно запрашиваются системой в режиме ожидания. Это означает, что, если защелку
нельзя установить, запрашивающий сеанс прекращает работу ("засыпает") на короткое время, а затем пытается повторить операцию. Другие защелки могут запрашиваться в оперативном режиме, т.е. процесс будет делать что-то другое, не ожидая возможности установить защелку. Поскольку возможности установить защелку может ожидать несколько запрашивающих сеансов, одни из них будут ожидать дольше, чем другие. Защелки выделяются случайным образом по принципу "кому повезет". Сеанс, запросивший установку защелки сразу после освобождения ресурса, установит ее. Нет очереди ожидающих освобождения защелки — есть просто "толпа" пытающихся ее получить.

Enqueues( англ. - ставит в очередь)
Внутренние блокировки — более сложное средство обеспечения очередности доступа, используемое, например, при изменении строк в таблице базы данных. В отличие от защелок, они позволяют запрашивающему "встать в очередь" в ожидании освобождения ресурса. Запрашивающий защелку сразу уведомляется, возможно ли это. В случае внутренней блокировки запрашивающий блокируется до тех пор, пока не сможет эту блокировку установить. Таким образом, внутренние блокировки работают медленнее защелок, но обеспечивают гораздо большие функциональные возможности. Внутренние блокировки можно устанавливать на разных уровнях, поэтому можно иметь несколько "разделяемых" блокировок и блокировать с разными уровнями "совместности".