#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
для снятия блокировки в обоих случаях должен быть выпущен orrollback
(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 = ‘КЛИЕНТЫ’;