Заблокировать таблицу в oracle

#oracle #oracle11g #locking

#Oracle #oracle11g #блокировка

Вопрос:

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

 LOCK TABLE CLIENTS IN EXCLUSIVE MODE
  

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

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

 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. Возникает вопрос о том, почему вы хотите заблокировать таблицу. Механизм транзакций и блокировки Oracle полностью отличается от других продуктов rdbms, с которыми вы, возможно, знакомы. Чрезвычайно редко возникает необходимость в явной блокировке таблицы в oracle.

Ответ №1:

вы можете использовать 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 для снятия блокировки в обоих случаях должен быть выпущен or rollback ( SX или X блокировки типа).

Комментарии:

1. Я просто тестирую, а не на производстве, я хочу заблокировать таблицу для обновления, вставки, удаления

2. @Leoh Хорошо, тогда попробуй это.

3. Но как выполняется запрос для блокировки таблицы: БЛОКИРОВКА КЛИЕНТОВ ТАБЛИЦЫ В ЭКСКЛЮЗИВНОМ РЕЖИМЕ не блокирует таблицу

4. @Leoh да, вы можете, я только что добавил подробное объяснение.

5. Я использую этот запрос, чтобы проверить, заблокирована ли она: ВЫБЕРИТЕ COUNT (*) total ИЗ V $ LOCKED_OBJECT l ВНУТРЕННЕЕ ОБЪЕДИНЕНИЕ DBA_OBJECTS d В l.object_id = d.object_id, ГДЕ d.object_type = ‘ТАБЛИЦА’ И d.object_name = ‘КЛИЕНТЫ’;