LOCK TABLE в Oracle SQL: как надёжно заблокировать таблицу

🟢 LOCK TABLE. Введение

Когда в базе данных одновременно работают несколько пользователей, могут возникнуть ситуации, когда:

  • Кто-то читает данные, а другой в это время их меняет

  • Возникают конфликты при обновлении

  • Данные становятся неконсистентными

Оператор LOCK TABLE позволяет временно заблокировать таблицу, чтобы другие сессии не могли её изменить до окончания вашей операции.


🔤 Написание

sql
LOCK TABLE имя_таблицы IN режим [MODE] [NOWAIT | WAIT N];

Примеры режимов:

  • SHARE

  • SHARE ROW EXCLUSIVE

  • EXCLUSIVE

  • ROW SHARE

  • ROW EXCLUSIVE

⚠️ По умолчанию сессия ждёт, если таблица уже заблокирована. Можно указать:

  • NOWAIT — не ждать, если блокировка невозможна

  • WAIT N — ждать N секунд


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

  • При вставке/обновлении данных в несколько этапов

  • В финансовых транзакциях

  • Для обеспечения целостности при сложной логике

  • В ETL-скриптах перед массовыми изменениями

  • В хранимых процедурах, когда нужно избежать конкуренции


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

1️⃣ Простая блокировка на обновление

sql
LOCK TABLE employees IN ROW EXCLUSIVE MODE;

Блокирует таблицу на запись — другие могут читать, но не изменять.


2️⃣ Эксклюзивная блокировка

sql
LOCK TABLE products IN EXCLUSIVE MODE;

Полная блокировка: никто, кроме вас, не может читать или писать.


3️⃣ SHARE MODE

sql
LOCK TABLE departments IN SHARE MODE;

Разрешает чтение другими сессиями, но не изменения.


4️⃣ SHARE ROW EXCLUSIVE MODE

sql
LOCK TABLE orders IN SHARE ROW EXCLUSIVE MODE;

Разрешает конкурентное чтение, но блокирует другие DML-операции.


5️⃣ LOCK TABLE с NOWAIT

sql
LOCK TABLE inventory IN ROW EXCLUSIVE MODE NOWAIT;

Если таблица уже занята — выдаёт ошибку сразу, не ждёт.


6️⃣ LOCK TABLE с ожиданием

sql
LOCK TABLE payroll IN EXCLUSIVE MODE WAIT 10;

Ждёт до 10 секунд, прежде чем сдаться.


7️⃣ LOCK TABLE внутри транзакции

sql
BEGIN
LOCK TABLE employees IN ROW EXCLUSIVE MODE;
UPDATE employees SET salary = salary * 1.1 WHERE department_id = 50;
COMMIT;
END;

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


8️⃣ Блокировка нескольких таблиц

sql
LOCK TABLE employees, departments IN SHARE MODE;

Одновременная блокировка двух таблиц.


9️⃣ Проверка блокировки: второе соединение

sql
-- Окно 1:
LOCK TABLE employees IN EXCLUSIVE MODE;
— Окно 2:
UPDATE employees SET salary = 1000 WHERE employee_id = 101; — Заблокируется

Демонстрация, как блокировка влияет на параллельные действия.


🔟 LOCK TABLE с подчинённой логикой

sql
LOCK TABLE balances IN ROW EXCLUSIVE MODE;
-- проверка и расчёты
UPDATE balances SET value = value - 100 WHERE account_id = 123;
COMMIT;

Без блокировки могли бы возникнуть конфликты или потеря данных.


🧩 Заключение

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

💡 Запомните:

  • Не забудьте всегда завершать блокировку через COMMIT или ROLLBACK

  • Используйте NOWAIT, если не хотите ждать

  • Не злоупотребляйте: долгие блокировки могут мешать другим


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

CONNECT_BY_ROOT в Oracle SQL: как определить корень иерархии для любой строки


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