|
|
|
Supreme Being
      
участник
Last Login: 21.02.2007 18:25
Сообщ.: 109,
Visits: 1 201
|
|
Предположим, запущенная из клиента TOAD процедура работает неудовлетворительно медленно и должна быть изменена. Прерываю задачу на клиенте, изменяю процедуру, но она больше не компилируется - TOAD фактически виснет. Переименовываю процедуру, компилирую, запускаю, но работает ещё медленнее. При особой настойчивости можно получить сообщение насчёт deadlock. При попытке посадить индекс в задействованняю таблицу получаю сообщение, что ресурс занят(процедура предварительно была, естественно, остановлена и с таблицей никто другой не работает). После перестартовки базы все становится, конечно, на свои места, изменённая процедура пашет нормально и под старым именем. Всё говорит о том, что и после остановки задачи на клиенте она продолжает обрабатываться на сервере. Но не может же быть, чтобы единственным выходом из подобной ситуации была перестартовка базы...
|
|
|
|
|
Junior Member
      
участник
Last Login: 22.12.2003 8:11
Сообщ.: 19,
Visits: 210
|
|
Судя по описанию, ты завершаешь работу только клиентской программы. При этом сессия на сервере еще некоторое время "живет", пока не будет убита специальным серверным процессом. И запущенная процедура продолжает работать, тормозит работу сервера в целом, не позволяет, естественно перекомпилировать себя и блокирует строки в изменяемой таблице. Deadlock'и возникают потому, что ты пытаешься другой процедурой сделать update уже блокированных строк. Обычно нет необходимости перезапускать сервер - НАДО УБИТЬ СЕССИЮ отключенного клиентского приложения. Сделать это можно из SQL*Plus, но проще из TOADD (Kill/Trace Session). Но только под правами администратора базы.
|
|
|
|
|
Supreme Being
      
участник
Last Login: 21.02.2007 18:25
Сообщ.: 109,
Visits: 1 201
|
|
Большое спасибо. А как выглядит синтаксис в SQL PLUS (на случай,если TOAD под рукой не имеется)? Я тут думал-думал и предполагаю, что это может быть связано с ROLLBACKом. То есть процедура прервана и начинает выполняться ROLLBACK (COMMIT стоял в самом конце). который тоже долго выполняется - потому всё и висит... Или это не то? Я вообще заметил, что если посадить COMMIT в LOOP - работает быстрее. Хотя это, безусловно, порочная практика... Ещё раз спасибо за подробное разъяснение - думаю, что необходимость опробавать твою рекомендацию не заставит себя долго ждать, - учимся на своих ошибках (;
|
|
|
|
|
Junior 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."
|
|
|
|
|
Supreme Being
      
участник
Last Login: 21.02.2007 18:25
Сообщ.: 109,
Visits: 1 201
|
|
Уф-ф... Наконец-то есть время ответить - был в командировках... Да и отвечать-то, собственно, нечего - остаётся только поблагодарить за исчерпывающую инфу. Из TOAD - уже использовал, хотя проблема долгого отката остаётся, никуда это не деть. Но, по крайней мере, всё теперь понятно. Без TOAD - тоже понятно, так что тему можно считать закрытой. Ещё раз большое спасибо и... успехов!
|
|
|
|