0 / 0 / 0
Регистрация: 11.10.2007
Сообщений: 103
|
|
1 | |
Прерванная процедура17.04.2008, 16:45. Показов 5268. Ответов 4
Метки нет (Все метки)
Предположим, запущенная из клиента TOAD процедура работает неудовлетворительно медленно и должна быть изменена. Прерываю задачу на клиенте, изменяю процедуру, но она больше не компилируется -
TOAD фактически виснет. Переименовываю процедуру, компилирую, запускаю, но работает ещё медленнее. При особой настойчивости можно получить сообщение насчёт deadlock. При попытке посадить индекс в задействованняю таблицу получаю сообщение, что ресурс занят(процедура предварительно была, естественно, остановлена и с таблицей никто другой не работает). После перестартовки базы все становится, конечно, на свои места, изменённая процедура пашет нормально и под старым именем. Всё говорит о том, что и после остановки задачи на клиенте она продолжает обрабатываться на сервере. Но не может же быть, чтобы единственным выходом из подобной ситуации была перестартовка базы...
0
|
17.04.2008, 16:45 | |
Ответы с готовыми решениями:
4
прерванная транзакция Прерванная работа ОС GULP BOWER прерванная инсталяция Прерванная операция в Ворд 2003 |
SINDY
|
|
13.05.2008, 15:01 | 2 |
Судя по описанию, ты завершаешь работу только клиентской программы. При этом сессия на сервере еще некоторое время 'живет', пока не будет убита специальным серверным процессом. И запущенная процедура продолжает работать, тормозит работу сервера в целом, не позволяет, естественно перекомпилировать себя и блокирует строки в изменяемой таблице. Deadlock'и возникают потому, что ты пытаешься другой процедурой сделать update уже блокированных строк.
Обычно нет необходимости перезапускать сервер - НАДО УБИТЬ СЕССИЮ отключенного клиентского приложения. Сделать это можно из SQL*Plus, но проще из TOADD (Kill/Trace Session). Но только под правами администратора базы. |
0 / 0 / 0
Регистрация: 11.10.2007
Сообщений: 103
|
|
14.05.2008, 12:01 [ТС] | 3 |
Большое спасибо. А как выглядит синтаксис в SQL PLUS (на случай,если
TOAD под рукой не имеется)? Я тут думал-думал и предполагаю, что это может быть связано с ROLLBACKом. То есть процедура прервана и начинает выполняться ROLLBACK (COMMIT стоял в самом конце). который тоже долго выполняется - потому всё и висит... Или это не то? Я вообще заметил, что если посадить COMMIT в LOOP - работает быстрее. Хотя это, безусловно, порочная практика... Ещё раз спасибо за подробное разъяснение - думаю, что необходимость опробавать твою рекомендацию не заставит себя долго ждать, - учимся на своих ошибках (;
0
|
SINDY
|
|
18.05.2008, 08:25 | 4 |
Когда ты убьешь сессию - тогда 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.' |
0 / 0 / 0
Регистрация: 11.10.2007
Сообщений: 103
|
|
25.05.2008, 13:06 [ТС] | 5 |
Уф-ф... Наконец-то есть время ответить - был в командировках...
Да и отвечать-то, собственно, нечего - остаётся только поблагодарить за исчерпывающую инфу. Из TOAD - уже использовал, хотя проблема долгого отката остаётся, никуда это не деть. Но, по крайней мере, всё теперь понятно. Без TOAD - тоже понятно, так что тему можно считать закрытой. Ещё раз большое спасибо и... успехов!
0
|
25.05.2008, 13:06 | |
25.05.2008, 13:06 | |
Помогаю со студенческими работами здесь
5
Прерванная установка Visual Studio 2010 Процедура ПередЗаписью и Процедура ПередЗаписьюНаСервере процедура процедура Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |