Добавить в корзинуПозвонить
Найти в Дзене
Oracle Developer

Блокировки в Oracle: как избежать проблем с конкурентным доступом? 🔒️

Работая с базой данных Oracle, разработчики неизбежно сталкиваются с вопросом блокировок. Это не баг, а важный механизм, который предотвращает хаос при одновременной работе нескольких пользователей с одними и теми же данными. Но если не понимать, как это работает, можно легко получить висящие сессии, дедлоки и жалобы от коллег. Давайте разберёмся! 💡 Существует два вида блокировок: системные и пользовательские. Первые автоматически управляются самой СУБД. Они служат для поддержания целостности данных, и разработчики с ними практически не взаимодействуют. А вот пользовательские блокировки – это наш инструмент управления конкурентным доступом. Их три, и каждую стоит знать. Это самая распространённая блокировка. Она предотвращает изменение выбранных строк другими сессиями, пока вы с ними работаете. Представьте, что два банка обрабатывают перевод между счетами. Если оба запроса одновременно изменят баланс, последствия могут быть плачевными. SELECT ... FOR UPDATE решает эту проблему: SELECT
Оглавление

Работая с базой данных Oracle, разработчики неизбежно сталкиваются с вопросом блокировок. Это не баг, а важный механизм, который предотвращает хаос при одновременной работе нескольких пользователей с одними и теми же данными. Но если не понимать, как это работает, можно легко получить висящие сессии, дедлоки и жалобы от коллег. Давайте разберёмся! 💡

Какие бывают блокировки?

Существует два вида блокировок: системные и пользовательские. Первые автоматически управляются самой СУБД. Они служат для поддержания целостности данных, и разработчики с ними практически не взаимодействуют. А вот пользовательские блокировки – это наш инструмент управления конкурентным доступом. Их три, и каждую стоит знать.

1️⃣ Блокировка строк: SELECT ... FOR UPDATE

Это самая распространённая блокировка. Она предотвращает изменение выбранных строк другими сессиями, пока вы с ними работаете. Представьте, что два банка обрабатывают перевод между счетами. Если оба запроса одновременно изменят баланс, последствия могут быть плачевными. SELECT ... FOR UPDATE решает эту проблему:

SELECT * FROM accounts WHERE account_id = 123 FOR UPDATE;

Пока сессия не выполнит COMMIT или ROLLBACK, никто другой не сможет изменить заблокированные строки. Используется часто, но требует осторожности — можно случайно «захватить» больше данных, чем нужно.

📌 Где применяют?

  • При работе с балансами и финансами
  • При обработке заказов, билетов, товаров на складе
  • В любых сценариях, где данные должны оставаться неизменными в процессе обработки

2️⃣ Программная блокировка через DBMS_LOCK

А теперь представьте, что у вас нет конкретных строк для блокировки, но есть фрагмент кода, который нельзя выполнять одновременно из нескольких сессий. Например, обработка отчёта, которая должна запускаться строго в одном экземпляре.

Вот тут помогает пакет DBMS_LOCK:

DECLARE
v_lock_handle VARCHAR2(128);
v_result NUMBER;
BEGIN
DBMS_LOCK.ALLOCATE_UNIQUE('my_lock', v_lock_handle);
v_result := DBMS_LOCK.REQUEST(v_lock_handle, DBMS_LOCK.X_MODE, 10, TRUE);
IF v_result = 0 THEN
-- Здесь выполняем нужный код
END IF;
END;
/

📌 Где применяют?

  • При выполнении уникальных задач (например, генерации отчётов)
  • В фоновых процессах, чтобы избежать дублирующегося выполнения
  • В сложной бизнес-логике, требующей синхронизации потоков

Используется нечасто, но когда нужно – спасает ситуацию! 🦸‍♂️

3️⃣ Полная блокировка таблицы: LOCK TABLE

Эта команда кардинальна – она запрещает всем остальным пользователям делать что-либо с таблицей, кроме чтения. Это как закрыть дверь в кабинет и никого не пускать.

LOCK TABLE employees IN EXCLUSIVE MODE;

Пока таблица заблокирована, другие запросы ждут, а вот SELECT по-прежнему работает.

📌 Где применяют?

  • Почти нигде 😅
  • В административных скриптах при массовых обновлениях
  • При миграциях и изменениях структуры данных

Но если вы вдруг увидели LOCK TABLE в коде приложения – стоит задуматься, а не переусложнено ли решение.

⚠️ Частые ошибки при работе с блокировками

✅ Забыли COMMIT или ROLLBACK – блокировка висит и мешает другим.

✅ Блокируете больше строк, чем нужно – снижаете производительность.

✅ Используете LOCK TABLE в боевом коде – превращаете систему в узкое горлышко.

----------

Хотите разбираться в таких вещах на экспертном уровне? На нашем YouTube-канале мы регулярно разбираем подобные темы, а в Telegram-канале можно задать вопросы и пообщаться с коллегами! Присоединяйтесь! 💡

А еще в нашей онлайн-школе мы проводим обучение по направлениям:🔸PL/SQL; 🔸оптимизация Oracle SQL; 🔸секционирование; 🔸архитектуре СУБД; 🔸Unit-тестированию и др.

Работаем как с физическими так и с юридическими лицами. Напишите в
нашу поддержку или Денису напрямую. Всё официально с возможностью получить налоговый вычет, использовать мат капитал или другие плюшки.

Лицензия на дополнительное образование взрослых и детей Л035-01199-54/01691393 выдана 13.01.2025 г. Министерством образование Новосибирской области Российской Федерации

🔗 Полезные ссылки:

#oracle #plsql #блокировки #sql #базыданных #разработка #it #бэкэнд #oracledeveloper