Блокировка стола в оракуле - PullRequest
1 голос
/ 14 марта 2019

Я хочу заблокировать таблицу в oracle, а затем проверить, не заблокирована ли она, Но я не могу заблокировать стол. Я попытался сделать это, чтобы заблокировать:

LOCK TABLE CLIENTS IN EXCLUSIVE MODE

это запрос к Lock, но я все еще могу обновить в этой таблице

, затем проверьте, заблокирован ли он:

SELECT COUNT(*) total FROM V$LOCKED_OBJECT l 
INNER JOIN DBA_OBJECTS d ON l.object_id = d.object_id 
WHERE d.object_type = 'TABLE' AND d.object_name = 'CLIENTS'

Как я могу заблокировать таблицу, а затем проверить, не заблокирована ли она php.

1 Ответ

2 голосов
/ 14 марта 2019

вы можете использовать for update:

select * from clients for update

, чтобы заблокировать все записи таблицы в эксклюзивном режиме (ROW_X (SX): Row Exclusive Table Lock -> "режим блокировки 3" ), но не рекомендуется для производственных систем.По крайней мере блокировка только для фильтрации ограниченного набора записей по предложению where.

Ваше утверждение (LOCK TABLE CLIENTS IN EXCLUSIVE MODE) также блокирует всю таблицу и вызывает Exclusive (X): Exclusive Table Lock -> "заблокированный режим 6" как команда с for update выше, т. Е. Логика работает как для блокировок SX, так и X, где оператор SELECT не имеет предложения where.Но в первом методе есть возможность ограничить количество записей, на которые влияет операция блокировки. Для снятия блокировки необходимо выдать

commit или rollbackдля обоих случаев (замки типа SX или X).

...