Пользовательские блокировки в Oracle
Как мы знаем, мы можем использовать пакет dbms_lock для управления блокировками нашего приложения. Для примера, мы можем создавать «блокировки» для синхронизации логики в нашем приложении, или мы можем «лочить» внешние ресурсы (такие как дескрипторы файлов, сетевые сокеты и пр). Можно использовать различные уровни (моды) для блокирования:
- nl -> «NuLl»
- ss -> «Sub Shared»
- sx -> «Sub eXclusive»
- s -> «Shared»
- ssx -> «Shared Sub eXclusive»,
- x -> «eXclusive»
Следущая таблица важна для понимания разницы в режимах блокировок: Если один процесс «держит блокировку», и другой процесс пытается получить»блокировку» на это этот же ресурс- он получит результат в соответсвии с этой таблице:

Также вы можете управлять временем ожидания получени блокировки, если ресурс блокирован уже, то ваш процесс будет ждать в в течении указаного времени.
Для примера:

Первый процесс создает блок на ресурс, потому что ресурс пока свободен (пусть например в режиме S).
Второй процесс пытается получить блокировку, с короткийм временем ожидания и не совместимым режимом (X), попытка вернет результат 1 – TimeOut.
Третий процесс будет запрашивать блокировку с долгим ожидаением и достигнет успеха, как только ресурс освободиться.
Четвертый процесс создаст новую пользовательскую блокировку на ресурс т.к. он имеет совместивый с текущей, режим блокировки (намример S)
Для мониторнига (отслеживания) пользовательских блокировок мы можете использовать:
- представление dba_lock (или v$lock),
- представление DBMS_LOCK_ALLOCATED
- представление v$session
скрипт UTLLOCKT.SQL
Дополнительная документация:
применимо к версии: Oracle 9.2


