WAIT в Oracle SQL — как управлять ожиданием блокировок

🟢 WAIT в Oracle SQL. Введение

WAIT в Oracle SQL как часть конструкции управления блокировками при доступе к данным. Он особенно актуален в командах типа SELECT FOR UPDATE, а также при работе с параллельными сессиями, транзакциями и механизмами конкурентного доступа.

WAIT определяет, будет ли сессия ожидать освобождения ресурса (строки, таблицы) и как долго, прежде чем вернуть ошибку.


🔤 Написание

sql
SELECT ... FOR UPDATE WAIT [N];

или

sql
SELECT ... FOR UPDATE NOWAIT;

🔄 Где используется

  • Управление блокировками строк

  • Реализация надёжной конкурентной логики

  • Исключение «виснущих» сессий

  • Поддержка бизнес-процессов с ожиданием

  • Защита от дедлоков


🧪 10 Примеров использования WAIT

1️⃣ Ожидание блокировки строки максимум 10 секунд

sql
SELECT * FROM orders
WHERE order_id = 100
FOR UPDATE WAIT 10;

2️⃣ Попытка захвата блокировки без ожидания

sql
SELECT * FROM orders
WHERE order_id = 100
FOR UPDATE NOWAIT;

Если строка уже заблокирована другой сессией — ошибка ORA-00054.


3️⃣ Сценарий: один пользователь редактирует заказ, другой ждет

sql
-- Сессия 1:
SELECT * FROM orders WHERE order_id = 1 FOR UPDATE;
— Сессия 2:
SELECT * FROM orders WHERE order_id = 1 FOR UPDATE WAIT 5;

4️⃣ Работа с курсором и WAIT

plsql
DECLARE
CURSOR c IS
SELECT * FROM inventory FOR UPDATE WAIT 3;
BEGIN
FOR r IN c LOOP
-- обработка записей
END LOOP;
END;

5️⃣ Защита от взаимных блокировок (deadlocks)

sql
-- Вместо бесконечного ожидания используем WAIT 5

6️⃣ Использование WAIT в процедурах

plsql
BEGIN
SELECT * INTO v_row
FROM clients
WHERE client_id = 42
FOR UPDATE WAIT 2;
END;

7️⃣ Логика попытки перехвата доступа

plsql
BEGIN
SELECT * INTO v_data
FROM reports
WHERE id = 100
FOR UPDATE WAIT 1;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Заблокировано другим пользователем');
END;

8️⃣ Диагностика текущих блокировок

sql
SELECT * FROM v$session WHERE blocking_session IS NOT NULL;

9️⃣ Совместное использование с COMMIT/ROLLBACK

sql
-- После SELECT ... FOR UPDATE обязательно завершать транзакцию
COMMIT;

🔟 Пример с NOWAIT для высокой конкуренции

sql
SELECT * FROM bank_accounts
WHERE account_id = 900
FOR UPDATE NOWAIT;

🧩 WAIT в Oracle SQL. Заключение

WAIT в Oracle SQL — это точный инструмент для управления ожиданием блокировок при работе с конкурентными данными. Он помогает избежать неожиданных зависаний, повысить устойчивость транзакций и реализовать гибкую логику обработки.

💡 Запомни:

  • WAIT n — ждать максимум n секунд

  • NOWAIT — не ждать, сразу ошибка при блоке

  • Используется с FOR UPDATE

  • Помогает в построении надёжных многопользовательских систем


🔜 Следующая статья:

VIRTUAL в Oracle SQL — как создавать вычисляемые столбцы без хранения данных


 

Понравилась статья? Поделиться с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии