Прерванная процедура
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Прерванная процедура Expand / Collapse
Автор
Сообщение
08.02.2002 16:08
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 21.02.2007 18:25
Сообщ.: 109, Visits: 1 201
Предположим, запущенная из клиента TOAD процедура работает неудовлетворительно медленно и должна быть изменена. Прерываю задачу на клиенте, изменяю процедуру, но она больше не компилируется -
TOAD фактически виснет. Переименовываю процедуру, компилирую, запускаю, но работает ещё медленнее. При особой настойчивости можно получить сообщение насчёт deadlock. При попытке посадить индекс в задействованняю таблицу получаю сообщение, что ресурс занят(процедура предварительно была, естественно, остановлена и с таблицей никто другой не работает). После перестартовки базы все становится, конечно, на свои места, изменённая процедура пашет нормально и под старым именем.
Всё говорит о том, что и после остановки задачи на клиенте она продолжает обрабатываться на сервере. Но не может же быть, чтобы единственным выходом из подобной ситуации была перестартовка базы...
Сообщ. #741186
06.03.2002 14:24
Junior Member

Junior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior Member

участник
Last Login: 22.12.2003 8:11
Сообщ.: 19, Visits: 210
Судя по описанию, ты завершаешь работу только клиентской программы. При этом сессия на сервере еще некоторое время "живет", пока не будет убита специальным серверным процессом. И запущенная процедура продолжает работать, тормозит работу сервера в целом, не позволяет, естественно перекомпилировать себя и блокирует строки в изменяемой таблице. Deadlock'и возникают потому, что ты пытаешься другой процедурой сделать update уже блокированных строк.
Обычно нет необходимости перезапускать сервер - НАДО УБИТЬ СЕССИЮ отключенного клиентского приложения. Сделать это можно из SQL*Plus, но проще из TOADD (Kill/Trace Session). Но только под правами администратора базы.
Сообщ. #743398
07.03.2002 11:24
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 21.02.2007 18:25
Сообщ.: 109, Visits: 1 201
Большое спасибо. А как выглядит синтаксис в SQL PLUS (на случай,если
TOAD под рукой не имеется)?
Я тут думал-думал и предполагаю, что это может быть связано с
ROLLBACKом. То есть процедура прервана и начинает выполняться ROLLBACK
(COMMIT стоял в самом конце). который тоже долго выполняется - потому всё и висит... Или это не то? Я вообще заметил, что если посадить
COMMIT в LOOP - работает быстрее. Хотя это, безусловно, порочная практика...
Ещё раз спасибо за подробное разъяснение - думаю, что необходимость
опробавать твою рекомендацию не заставит себя долго ждать, - учимся на
своих ошибках (;
Сообщ. #743496
11.03.2002 7:48
Junior Member

Junior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior Member

участник
Last Login: 22.12.2003 8:11
Сообщ.: 19, Visits: 210
Когда ты убьешь сессию - тогда ROLLBACK, конечно, будет выполняться.
Как убить сессию из SQL*Plus? Цитирую "Oracle 7. Руководство администратора":
"...Для идентификации убиваемой сессии укажите ее индексный номер и
ее серийный номер. Чтобы определить индексный номер (SID) и
серийный номер сессии, опросите динамическую таблицу
производительности V$SESSION. Например, следующий запрос
идентифицирует все сессии для пользователя JWARD:

SELECT sid, serial#
FROM v$session
WHERE username ='JWARD';

SID SERIAL#
--------- ---------
7 15

Когда сессия снимается, ресурсы, удерживаемые ею (такие как
блокировки и области памяти), немедленно освобождаются и
становятся доступными другим сессиям.
...
Обзор V$SESSION также показывает состояние (STATUS) текущих
сессий. Строка для снятой сессии удаляется из этого обзора,
когда пользователь получает сообщение ORA-00028.

Следующий пример показывает, как АБД убивает неактивную сессию:

SELECT sid, serial#, status, server
FROM v$session
WHERE username = 'JWARD';

SID SERIAL# STATUS SERVER
---------- ------- -------- ---------
7 15 INACTIVE DEDICATED

ALTER SYSTEM KILL SESSION '7,15';

SELECT sid, serial#, status, server
FROM v$session
WHERE username = 'JWARD';

SID SERIAL# STATUS SERVER
---------- ------- -------- ---------
7 15 KILLED PSEUDO

Если активная сессия не может быть прервана (например, она
выполняет сетевой ввод-вывод или откатывает транзакцию), то
сессия не может быть снята до окончания этой операции. В этом
случае сессия удерживает все свои ресурсы вплоть до снятия.
Кроме того, сессия, выдавшая предложение ALTER SYSTEM для снятия
другой сессии, ожидает снятия сессии до 60 секунд; если
операция, которая не может быть прервана, продолжается дольше
одной минуты, то инициатор предложения ALTER SYSTEM получает
сообщение, указывающее, что сессия была "помечена" для снятия.
Сессия, помеченная для снятия, выдается в обзоре V$SESSION с
состоянием KILLED и с сервером, отличным от PSEUDO."
Сообщ. #743692
18.03.2002 12:29
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 21.02.2007 18:25
Сообщ.: 109, Visits: 1 201
Уф-ф... Наконец-то есть время ответить - был в командировках...
Да и отвечать-то, собственно, нечего - остаётся только поблагодарить за исчерпывающую инфу. Из TOAD - уже использовал, хотя проблема
долгого отката остаётся, никуда это не деть. Но, по крайней мере, всё теперь понятно. Без TOAD - тоже понятно, так что тему можно считать закрытой.
Ещё раз большое спасибо и... успехов!
Сообщ. #744396
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl

Время GMT +3:00, Сейчас 3:30