04.03.2009, 12:56 | #1 |
MCTS
|
Работа при принудительном завершении аксапты
давно интересует этот вопрос. Что, если идет какая-то операция, а мы снимаем клиента (процесс) диспетчером задач.
Если код выполнялся в этот момент на клиенте, то транзакция не завершится и изменений в базе не произодет. Что станет с транзакцией, так и будет висеть? Если код в этот момент выполняется на сервере приложения, то вообще не понятно.... |
|
04.03.2009, 13:34 | #2 |
Участник
|
Если код выполняется на сервере, то сервер узнает что клиент отвалился только когда код доработает соответственно если транзакция на сервере то она завершиться если на клиенте то нет
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy |
|
|
За это сообщение автора поблагодарили: Eldar9x (1). |
04.03.2009, 13:47 | #3 |
MCTS
|
Спасибо. Как-то это не радует....
upd. Цитата:
транзакция на сервере то она завершиться
X++: static server void serverrun() { table1 table1; table1 t; int i; ; select count(RecId) from t; ttsbegin; sleep(20000); table1.Field1 = t.RecId; table1.insert(); ttscommit; } X++: static server void serverrun() { table1 table1; table1 t; int i; ; select count(RecId) from t; ttsbegin; for (i = 1; i <= 10; i++) { sleep(2000); table1.Field1 = t.RecId; table1.insert(); } ttscommit; } Последний раз редактировалось Eldar9x; 04.03.2009 в 14:06. |
|
04.03.2009, 14:22 | #4 |
Ищущий знания...
|
замечал что если убить сессию на клиенте, то в БД сессия остается и дорабатывает если её не грохнуть
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
04.03.2009, 14:43 | #5 |
Участник
|
Цитата:
Первый код вставляет запись. Второй нет.
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy |
|
04.03.2009, 15:23 | #6 |
MCITP
|
Цитата:
Сообщение от Eldar9x
Спасибо. Как-то это не радует....
upd. не обязательно, судя по всему X++: static server void serverrun() { table1 table1; table1 t; int i; ; select count(RecId) from t; ttsbegin; sleep(20000); table1.Field1 = t.RecId; table1.insert(); ttscommit; } X++: static server void serverrun() { table1 table1; table1 t; int i; ; select count(RecId) from t; ttsbegin; for (i = 1; i <= 10; i++) { sleep(2000); table1.Field1 = t.RecId; table1.insert(); } ttscommit; }
__________________
Zhirenkov Vitaly |
|
04.03.2009, 15:26 | #7 |
MCTS
|
Цитата:
если это имеются ввиду джобы (serverrun), то они вроде как всегда работают на клиенте, даже если явно написать модификатор server...
Цитата:
чудес небывает) должны доработать оба...
Последний раз редактировалось Eldar9x; 04.03.2009 в 15:33. |
|
04.03.2009, 15:53 | #8 |
Участник
|
а так? на каком шаге вылетает?
X++: tatic server void serverrun() { table1 table1; table1 t; int i; ; select count(RecId) from t; for (i = 1; i <= 10; i++) { sleep(2000); ttsbegin; table1.Field1 = t.RecId + i; table1.doInsert(); ttscommit; } }
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy |
|
04.03.2009, 16:06 | #9 |
MCTS
|
Цитата:
а так?
|
|
04.03.2009, 16:48 | #10 |
Участник
|
Цитата:
успело вставиться 7 записей. И не вылетает, а сам убиваю процесс.
какоето нехорошее поведение( ладно бы 0, 1 или 10 а тут 7... надо звать гуру)
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy |
|
04.03.2009, 18:30 | #11 |
MCITP
|
Ничего удивительного, на мой взгляд. Полная корреляция со вторым примером Эльдара. Просто во втором примере транзакция одна, и поэтому когда где-то в середине слетает, то не вставляется ничего. А в данном случае что-то успевает вставиться...
Из всего вышесказанного можно сделать вывод, что это не совсем так. На самом деле, похоже, сервер проверяет активность клиента с какой-то периодичностью, и это может происходить прямо посреди исполнения метода на сервере (и вне зависимости от транзакции). Единственное, что я точно замечал, что это (проверка активности клиента) никогда не происходит, когда сервер выполняет какую-то долгоиграющую операцию с БД, типа большого селекта, например, или висящего заблокированного апдэйта. В этой ситуации клиента можно снять, но операция на сервере останется висеть очень долго, пока не отработает, либо не кильнёшь сессию на БД. Вот.
__________________
Zhirenkov Vitaly |
|
04.03.2009, 19:10 | #12 |
Участник
|
Цитата:
Из всего вышесказанного можно сделать вывод, что это не совсем так. На самом деле, похоже, сервер проверяет активность клиента с какой-то периодичностью, и это может происходить прямо посреди исполнения метода на сервере (и вне зависимости от транзакции). Единственное, что я точно замечал, что это (проверка активности клиента) никогда не происходит, когда сервер выполняет какую-то долгоиграющую операцию с БД, типа большого селекта, например, или висящего заблокированного апдэйта. В этой ситуации клиента можно снять, но операция на сервере останется висеть очень долго, пока не отработает, либо не кильнёшь сессию на БД. Вот.
интересно можно ли заставить сервер не опрашивать клиента? может обрамить вызов метода startLenghtyOperation(), endLenghtyOperation()?
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy |
|
05.03.2009, 00:01 | #13 |
Участник
|
|
|
05.03.2009, 11:04 | #14 |
MCITP
|
Помойму это несколько лишнее - перегиб палки.
В каких случаях это может быть полезно, можете предложить? Просто нужно все подобные операции по возможности делать в одной транзакции, тогда в случае обрыва либо отработает всё, если успеет, либо ничего...
__________________
Zhirenkov Vitaly |
|
|
|