PDA

View Full Version : вопрос от Банди



Милька
05-06-2009, 07:00 PM
Оракл процесс терминейшн.

Запрос из веб клиента в оракл запускает пл-скьюэл прогу. Там разные манипуляции, ачинающиеся инсертом в контрольную таблицу, после чего следует много разного (неважно), но в любом случае на выходе программа подразумевает удаление инсертнутого на старте рекорда. Все это - в едином запросе.
Внимание тупой вопрос: если юзер вдруг вырубает окно клиента, может ли PLSQL внезапно прекратиться, и если да, то при каких обстоятельствах, кроме крэша базы? Теоретически, я понимаю что по идее процесс будет продолжаться, но на деле не раз вырубанием клиента (SQL+ например) останавливала начатый в нем PLSQL процесс.
Надо срочно , т.к. именно на этом утверждении я имела неосторожность основывать свои рекомменндации по устранению проблемы, чем, похоже совершила большую глупость, так как на это мне уже ответили тирадой о том что терминация клиента не влияет на остановку проги, но все равно хотелось перепроверить.
За подтверждение моего утверждения, подкрепленное конкретной инфой – бутылка. За действенный план спасения моей нещасной задницы возможен интим с идиоткой или бартер по курсу.


далее



Цылую фсех.
Мяф.

clueless
05-06-2009, 09:09 PM
далее
и хоть бы хто польстился мля.....

Спасибо Милька еще раз:lip:

Ватрушка
05-06-2009, 09:42 PM
мои крутые программисты сказали что здесь возникает много вопросов :) а им лень их задавать :( а еще они ответили. что скорее всего нет, но(дальше идут опять вопросы :)) сорри, Бандя, я честно к ним пристала и пыталась тебе помочь :)

clueless
05-06-2009, 09:51 PM
мои крутые программисты сказали что здесь возникает много вопросов :) а им лень их задавать :( а еще они ответили. что скорее всего нет, но(дальше идут опять вопросы :)) сорри, Бандя, я честно к ним пристала и пыталась тебе помочь :)
фсо равно спасибо тебе за усердие!

Ватрушка
05-06-2009, 09:52 PM
фсо равно спасибо тебе за усердие!
Банди, они просто уже о своем говорят и говорят у них параллельно много вопросов возникает что и как, чтобы разобраться может или нет... а они уже под шафе ) п. с. когда уедет второй программист и ты еще будешь здесь, я могу на мужа подмемть :) и попытать, но у него будут вопросы на которые тебе надо будеть ответить чтобы подучить ответ на твой вопрос :)

Serge24
05-06-2009, 09:54 PM
не фига непонял:grust:

clueless
05-06-2009, 10:01 PM
Банди, они просто уже о своем говорят и говорят у них параллельно много вопросов возникает что и как, чтобы разобраться может или нет... а они уже под шафе ) п. с. когда уедет второй программист и ты еще будешь здесь, я могу на мужа подмемть :) и попытать, но у него будут вопросы на которые тебе надо будеть ответить чтобы подучить ответ на твой вопрос :)
спасиба..
щас. надо хотя бы из пофумов выйти шоп почитать всякую херну на этот щёт. Пока же мои успехи тоже в количестве выпитого:)

Бегемот
05-06-2009, 10:02 PM
спасиба..
щас. надо хотя бы из пофумов выйти шоп почитать всякую херну на этот щёт. Пока же мои успехи тоже в количестве выпитого:)

козленочком станешь. (С)

Sixteen
05-06-2009, 10:10 PM
моя канешно морон в ораклах, но вот што говорит сам оракл:

http://download.oracle.com/docs/cd/A58617_01/network.804/a58230/ch2.htm#742827

параграф 2.2.2.1

типа если дисконектнуть клиента то TNS listener aba vsem dagadaicco. i zamochit server-side process.

zvizda
05-06-2009, 10:13 PM
так что.. ура, я так понимаю?

Sixteen
05-06-2009, 10:24 PM
так что.. ура, я так понимаю?

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

clueless
05-07-2009, 01:07 AM
не, там всо нормално. ПЛ процесс не дохнет, ему хотьбышто. Я это тупо себе доказала методом тыка.
Проблема в другом, и я ее нашло, даром что дыбил.

crazy-mike
05-07-2009, 02:26 AM
не фига непонял:grust:
А что там непонятного? Вырубание окна в самом деле должно бы означать "прекращение загрузки кода страницы". Весь фокус в том - что процесс на сервере в самом деле прерывается по закрытию сокета со стороны клиента.
:vacation:
Но если запрос был запущен "без ожидания завершения" - то он скорее всего будет выполнен.
Формально - достаточно сначала выполнить запрос , а потом уже сгенерировать код страницы. На самом деле из-за механизма реализации SIGKILL,SIGABRT всё не так просто (ещё и под разными серверами можно получать разные результаты в зависимости от загрузки). Проще изменить "бизнес-логику" чем такое "отлаживать". :grum:

crazy-mike
05-07-2009, 02:30 AM
нисавсем, паскоку у нас есть микрафот ай ай асс конекшен пул который может памешать нам дисканектнуть бекоз канекшен пул из э бич. а во вторых могут быть пре-спаунд сервер сайд процессы которые не умерают при дисконнекте клеента. там есть такая крутая опцыйа. патамушто оракл - збореще мазерфакинг факеров.
Обычно они "умирают" минут 30 примерно (агонизируют)...:grum:
Но "растягивать сложные запросы" на "генерируемую веб-страницу" - это очень неудачное решение. Проще вывести "незакрываемое" окно , а внутри выполнить запрос к скрипту через AJAX асинхронно. :grum:

crazy-mike
05-07-2009, 02:31 AM
не, там всо нормално. ПЛ процесс не дохнет, ему хотьбышто. Я это тупо себе доказала методом тыка.

Это очень трудно "тестить" чтобы "перетыкать" все возможные случаи - поскольку там пересекаются нагрузки веб-сервера и сервера БД. :grum:

Тая
05-07-2009, 03:41 AM
Бандь.я только сейчас увидела твою тему,вопрос твой переправлен одной хорошей программистке,через минут десять должен прийти ответ,а вот что пока что мне удалось узнать у моего знакомого...

1. есть такая штука как вызов хранимых процедур
тогда если клиент ее уже вызвал и отрубился, то процедура отработает до конца, но следующие операции не пройдут поскольку сессия с клиентом-инициатором похерена.

2. как определена транзация? если все в куче, то пройдет rollback

Тая
05-07-2009, 03:53 AM
Бандь,видимо для того чтоб ответить на твой вопрос надо знать много нюансов:rolleyes:Вот что мне написали
" как и что писано в ДАННОЙ процедуре, был или не был явно указан старт транзакии, может там всередине были коммиты...

некоторые клиенты могут прерывать выполнение скриптов, некотрые не могут..."

crazy-mike
05-07-2009, 04:32 AM
1. есть такая штука как вызов хранимых процедур
тогда если клиент ее уже вызвал и отрубился, то процедура отработает до конца, но следующие операции не пройдут поскольку сессия с клиентом-инициатором похерена.
2. как определена транзация? если все в куче, то пройдет rollback
Вот-вот. - оно самое. :grum: Именно потому таким способом это лучше не делать.

Тая
05-07-2009, 05:31 AM
Короче так,один програмер мне сказал вот что:"процесс умирает сразу же ,он может остаться если запрос тяжелый ,выборка из пиздатой таблицы или какие-то еще заманухи - тогда он висит долго (зависшая сессия ) но в конечном счете все равно умирает

Второй сказал вот это,ну вообщем то что первый назвал заманухой:"если после запуска процедура не взаимосвязана с клиентом а сервер не завершает клиентское соединение по тайм-ауту то процедура действительно может продлиться"

clueless
05-07-2009, 10:18 AM
Это очень трудно "тестить" чтобы "перетыкать" все возможные случаи - поскольку там пересекаются нагрузки веб-сервера и сервера БД. :grum:
Майк, спасибо за ответы.
Само собой, просто тупо тыкать во что попало - глупо. Я тыкнула с определенной целью замедлить интересующий меня процесс до 5-6 минут и тупо закрыть вырубанием окна. Процесс завершылся, доказав мне что я нипраф.
Затто я обнаружила глупый баг, связанный с имплисит конвертированием в функции NVL, который скорее всего тоже ни на что не влияет, иначе программа крашалась в половине случаев, а она этово не делает.
Сижу тут такая, короче, думаю над обстоятельным ответом турецкому султану.

clueless
05-07-2009, 10:19 AM
Обычно они "умирают" минут 30 примерно (агонизируют)...:grum:
Но "растягивать сложные запросы" на "генерируемую веб-страницу" - это очень неудачное решение. Проще вывести "незакрываемое" окно , а внутри выполнить запрос к скрипту через AJAX асинхронно. :grum:
щасс, они прюм все разбегуццо переписывать скрипты:) в лучшем случае, прогресс бар.

Радригес
05-07-2009, 10:22 AM
кто к нам с сиквелем придет по ораклу и получит (ц)

clueless
05-07-2009, 10:24 AM
Бандь,видимо для того чтоб ответить на твой вопрос надо знать много нюансов:rolleyes:Вот что мне написали
" как и что писано в ДАННОЙ процедуре, был или не был явно указан старт транзакии, может там всередине были коммиты...

некоторые клиенты могут прерывать выполнение скриптов, некотрые не могут..."
коммит один, только в начале чтобы зафиксировать первый инсерт. Потом долго-долго ничего нет, вызов другой процедуры (в коротой, я имею основания полагать, сидит баг), потом вконце удалеие тово самого рекорда с коммитом, потом идут титры:)
понятно что где-то в середине оно вырубаетсо и роллбэкает вплоть до первого коммита. Вопрос - где? И что при этом делает юзарь?

смешно
05-07-2009, 04:19 PM
Если "процесс" состоит из multiple sql commands, то те команды, которые ещё не успели execute, они и не будут execute после отрубания клиента. Проверено на практике. Но если ты executed stored procedure, то она будет continue to run.

Из web клиента, как правило, запускается procedure или package.
Поэтому будет ранаться.

clueless
05-07-2009, 04:21 PM
Если "процесс" состоит из multiple sql commands, то те команды, которые ещё не успели execute, они и не будут execute после отрубания клиента. Проверено на практике. Но если ты executed stored procedure, то она будет continue to run.

aaga...

смешно
05-07-2009, 04:27 PM
aaga...


ну ты всё поняла в таком случае. У меня такое было и не раз. Прикинь, сделал ошибку, в процедуре, там получилась бесконечная LOOP. Ничего не поможет, пока не KILL process, Это независимo закрыл ты или DISCONNECT.

clueless
05-07-2009, 04:52 PM
ну ты всё поняла в таком случае. У меня такое было и не раз. Прикинь, сделал ошибку, в процедуре, там получилась бесконечная LOOP. Ничего не поможет, пока не KILL process, Это независимo закрыл ты или DISCONNECT.
инфинит луп - да, только душить. А к примеру запущена длинная и запутанная процедура в sql+, а в другом окне ты компеллируешь эту же процедуру (со мной это происходит регулярно), то первая процедура не даст хода второй, и обе повиснут. Так вот, в этом случае первое окно вырубаетсо запросто.

смешно
05-08-2009, 03:42 PM
я уже работаю только с веб клиентами, там сделано более умно, и ничего не зависает, (ждёт пока откомпелируется), да и вообще SQL+ разве кто пользуется?, TOAD для этих целей....и других... ну ты сама знаешь, если Ораклом пользуешься.

я теперь в ЛУПАХ ставлю if i > XXX then exit; end if;
just in case

crazy-mike
05-09-2009, 05:58 AM
щасс, они прюм все разбегуццо переписывать скрипты:) в лучшем случае, прогресс бар.
Первую версию "типа программы" ведь "всегда выбрасывают"!!!! :grum:
Переписать на самом деле намного проще - по крайней мере тех "ошибок" , которые были сделаны в "первой версии" уже не будет (новые конечно же "типа появятся" :grum: Но их искать будет уже проще. ).

peterburger
05-10-2009, 05:14 PM
Если "процесс" состоит из multiple sql commands, то те команды, которые ещё не успели execute, они и не будут execute после отрубания клиента. Проверено на практике. Но если ты executed stored procedure, то она будет continue to run.
Из web клиента, как правило, запускается procedure или package.
Поэтому будет ранаться.

Дело не в кол-ве стейтментов а в транзакции.
И где зарыт коммит.

Карлсон
05-10-2009, 05:22 PM
:popcorn::popcorn::popcorn:
:popcorn::popcorn::popcorn:
кто все эти люди?:grum::grum:

crazy-mike
05-11-2009, 03:49 AM
Дело не в кол-ве стейтментов а в транзакции.
И где зарыт коммит.
Ага. Только дело осложняется всякими там set autocommit on :grum:
(по крайней мере в MySQL есть такая "типа шиза" :grum:)

peterburger
05-11-2009, 09:10 AM
Ага. Только дело осложняется всякими там set autocommit on :grum: (по крайней мере в MySQL есть такая "типа шиза" :grum:)


[set autocommit on - is not a very smart thing to do in a real application. ]
Шиза эта есть везде, но это не значит что ее нужно использовать.

Судя по пред. постам. у Банди транзакция написана в Индии. ;)
Потому как оно все должно быть как один [UOW]. Без коммитов и роллбаков посредине.

[never never change your lover in the middle of the night... (c)]

crazy-mike
05-11-2009, 09:37 AM
[set autocommit on - is not a very smart thing to do in a real application. ]
Шиза эта есть везде, но это не значит что ее нужно использовать.
Судя по пред. постам. у Банди транзакция написана в Индии. ;)
Потому как оно все должно быть как один [UOW]. Без коммитов и роллбаков посредине.

Не знаю - как пишут в Индии - но можно просто было "послать сообщение" на "выделенный сервер приложений" (с вызовом "выполнения запроса" ) и особенно сильно не волноваться о "разрыве соединения". :vacation:

peterburger
05-11-2009, 01:47 PM
Не знаю - как пишут в Индии - но можно просто было "послать сообщение" на "выделенный сервер приложений" (с вызовом "выполнения запроса" ) и особенно сильно не волноваться о "разрыве соединения". :vacation:

Если бы я еще хоть слово понял из выше сказанного. ;)
Но звучит - красиво, как по фене ;)

crazy-mike
05-11-2009, 04:27 PM
Если бы я еще хоть слово понял из выше сказанного. ;)
Но звучит - красиво, как по фене ;)
Выполнять соединения с БД из процесса не на веб-сервере , а с другой машины. :grum:(это если "не по фене"). Из процесса на веб-сервере посылается маленькая команда "выполнить процедуру XYZ" (можно тупо датаграмму послать даже). Никаких задержек во время генерации страницы при этом не будет.

Медвед
05-11-2009, 05:07 PM
но если посла датакилограмму , то будет большая задержка

crazy-mike
05-11-2009, 05:34 PM
но если посла датакилограмму , то будет большая задержка
Вообще никакой задержки не будет. :grum:Даже время на установление соединения не будет тратиться.

Медвед
05-11-2009, 05:38 PM
почему? :grum:

Serge24
05-11-2009, 05:44 PM
Вообще никакой задержки не будет. :grum:Даже время на установление соединения не будет тратиться.

Немного оффтопа.
@crazy-mike и те кто разбираются в sql.
Как обновить определённое значение в таблице:
Вот пример запроса имени и группы по имени.

union+select concat_ws(0x3a,name,mgroup) from dbforum.ibf_members where+name=0x[hex(m.name)]

А как обновить параметр mgroup, или несколько параметров? Приведите пример плиз.

crazy-mike
05-12-2009, 01:32 AM
Немного оффтопа.
@crazy-mike и те кто разбираются в sql.
Как обновить определённое значение в таблице:
Вот пример запроса имени и группы по имени.

union+select concat_ws(0x3a,name,mgroup) from dbforum.ibf_members where+name=0x[hex(m.name)]А как обновить параметр mgroup, или несколько параметров? Приведите пример плиз.
update abc set a=...., b=...., c=.... ,... where .... :grum:
Весь прикол в том что после = везде могут быть select , которые возвращают "единичные значения" (не таблицы)
:grum:
Это очень хороший способ "подвесить" SQL-сервер вообще-то...

Serge24
05-12-2009, 07:52 AM
update abc set a=...., b=...., c=.... ,... where .... :grum:
Весь прикол в том что после = везде могут быть select , которые возвращают "единичные значения" (не таблицы)
:grum:
Это очень хороший способ "подвесить" SQL-сервер вообще-то...

Нагружает сильно?:(
Мне надо тихо чтобы не заметили..

crazy-mike
05-12-2009, 08:10 AM
Нагружает сильно?:(
Мне надо тихо чтобы не заметили..
Очень сильно зависит от того - как выбраны первичные ключи и как используются индексы. :grum:

Serge24
05-12-2009, 08:43 AM
Очень сильно зависит от того - как выбраны первичные ключи и как используются индексы. :grum:

Блин не получается update выполнить наверно прав только на просмотр хватает:grust:
Ладно всюравно спасибо:vacation:

Bandi
05-12-2009, 08:48 AM
Блин не получается update выполнить наверно прав только на просмотр хватает:grust:
Ладно всюравно спасибо:vacation:
ты чо там хакаешь?

П.С. всем спасибо за участие. с проблемой разобралась.
Петька, напрасно ты так об Индии. Тупость не имеет географических границ:)))

Serge24
05-12-2009, 08:53 AM
ты чо там хакаешь?



Да, через sql иньекцию, хеши пассов вынул, а их фиг пробрутиш, на форуме то ладно печенья подставил и всё, только там ещё один сайт, с админкой сервера, там имена печенья незвесны, только или пароль пробрутить(что не реально скорее всего), или на своём акке группу сменить.:vacation:

Bandi
05-12-2009, 08:58 AM
Да, через sql иньекцию, хеши пассов вынул, а их фиг пробрутиш, на форуме то ладно печенья подставил и всё, только там ещё один сайт, с админкой сервера, там имена печенья незвесны, только или пароль пробрутить(что не реально скорее всего), или на своём акке группу сменить.:vacation:
Можно достать идентичный пакет и загрузить из него базу. Правда что тебе тоже фик что даст, разве что ты сможешь с помощью его пробить админовский пассворд ;)

Serge24
05-12-2009, 09:07 AM
Можно достать идентичный пакет и загрузить из него базу. Правда что тебе тоже фик что даст, разве что ты сможешь с помощью его пробить админовский пассворд ;)

Думаю легче найти человека хоть с минимальными правами в админке сервера, пробрутить его пасс и узнать имена печенья, дальше просто админа подставить и всё. Просто лень перебирать всех сотрудников:grust:

Bandi
05-12-2009, 09:09 AM
Думаю легче найти человека хоть с минимальными правами в админке сервера, пробрутить его пасс и узнать имена печенья, дальше просто админа подставить и всё. Просто лень перебирать всех сотрудников:grust:
Ты низкоморальный лентяй

Serge24
05-12-2009, 09:10 AM
Ты низкоморальный лентяй

Какой есть:vacation:
Но мараль у меня всётаки есть, людей не убивать, не грабить, не насилывать. Мораль же, да?
Я же не собираюсь чтото там удалять или устраивать беспорядки:vacation: