ORA-00054: ресурс занят и приобретается с помощью NOWAIT

Я убил script, который был посередине обновления таблицы. Теперь, когда я перезапускаю script, я получаю,

ORA-00054: ресурс занят и приобретается с указанным NOWAIT

Я полагаю, что таблица заблокирована?. Как разблокировать таблицу?. Спасибо заранее.

Ответ 1

Шаг 1:

select object_name, s.sid, s.serial#, p.spid 
from v$locked_object l, dba_objects o, v$session s, v$process p
where l.object_id = o.object_id and l.session_id = s.sid and s.paddr = p.addr;

Шаг 2:

alter system kill session 'sid,serial#'; --'sid' and 'serial#' get from step 1

Дополнительная информация: http://www.oracle-base.com/articles/misc/killing-oracle-sessions.php

Ответ 2

Вам придется подождать. Сессия, которая была убита, была в середине транзакции и обновила множество записей. Эти записи должны быть отменены, и некоторые фоновые процессы позаботятся об этом. Тем временем вы не можете изменять записи, которые были затронуты.

Ответ 3

Спасибо за информацию пользователя user712934 '

Вы также можете найти информацию о sql, username, machine, port и перейти к фактическому процессу, который содержит соединение

SELECT O.OBJECT_NAME, S.SID, S.SERIAL#, P.SPID, S.PROGRAM,S.USERNAME,
S.MACHINE,S.PORT , S.LOGON_TIME,SQ.SQL_FULLTEXT 
FROM V$LOCKED_OBJECT L, DBA_OBJECTS O, V$SESSION S, 
V$PROCESS P, V$SQL SQ 
WHERE L.OBJECT_ID = O.OBJECT_ID 
AND L.SESSION_ID = S.SID AND S.PADDR = P.ADDR 
AND S.SQL_ADDRESS = SQ.ADDRESS;

Ответ 4

Когда вы убили сеанс, сеанс некоторое время зависает в статусе "KILLED", после чего Oracle очищается после него.

Если вам абсолютно необходимо, вы также можете убить процесс ОС (посмотрите v$process.spid), который выпустит любые блокировки, на которые он держал.

Подробнее см. для более подробной информации.

Ответ 5

В зависимости от вашей ситуации блокировка таблицы может быть частью нормальной работы, и вы не хотите просто убивать транзакцию блокировки. То, что вы хотите сделать, - заставить ваш оператор ждать другого ресурса. Oracle 11g имеет тайм-ауты DDL, которые можно установить, чтобы справиться с этим.

Если вы имеете дело с 10g, вам нужно получить больше креатива и написать PL/SQL для обработки повторной попытки. Посмотрите Обход ORA-00054 в Oracle 10g Это повторяет выполнение вашего оператора, когда возникает исключение resource_busy.