12.09.2011, 15:03 | #1 |
Участник
|
Неявные транзакции
Всем привет! Надеюсь на помощь коллективного разума.
Проблема в следующем: Пользователи работают на удаленных рабочих столах, при этом у одного - двух различных аккуантов регулярно происходят сбои (один, два раза в месяц), а именно - постоянно "держится" транзакция на SQL, при этом они спокойно перемещаются по записям, закрывают формы, в общем живут обычной жизнью. Если посмотреть на остальных юзеров, то видно, что они получают доступ только к тем данным, которые не "читаются" сессией, вызвавшей коллапс (что логично при транзакции), откуда, естественно возникают жуткие "тормоза". После того как "зависшую" сессию завершили принудительно - теряются данные за последние 10 - 20 мин работы... Что было предпринято: Просмотрели весь код на наличие непарных ttsbegin / ttscommit (хотя даже в таком случае штатный механизм должен ругаться), создали несколько новых аккуантов, что не помгло - один из новых так же "повесился", сбрасывали кеш, переиндексировали приложение... В общем варианты закончились...Что примечательно, другие пользователи при аналогичных условиях (права, доступ к функционалу, сеть, машины), работают стабильно... Подскажите, что еще можно сделать или куда копать. Заранее благодарен... ЗЫ: Ax 4.0 kernel version 4.0.2501.116 application version 4.0.2501.121 SQL 2008 |
|
12.09.2011, 15:14 | #2 |
Участник
|
Цитата:
Просмотрели весь код на наличие непарных ttsbegin / ttscommit
1. Открывается форма из кода внутри начатой транзакции. После этого Аксапте обычно сносит крышу могут быть описанные вами эффекты. Я раньше боролся на проекте с такими багами, ставил ловушки. Например, можно написать в глобале метод, который проверяет если транзакция открыта, то пишет в отдельном соединении к БД в специальный лог стек вызова. И поставить вызов этого метода в \Classes\SysSetupFormRun\init и во все методы класса BOX. Тогда гарантировано вы поймаете в логе все стеки вызовов которые приводят к таким проблемам и сможете вылечить. 2. Просто в коде есть непарные ttsbegin / ttscommit - как ловить - затрудняюсь описать. Для начала на основных табличках проверить нет ли return или break или continue внутри ttsbegin / ttscommit |
|
|
За это сообщение автора поблагодарили: denni (1). |
12.09.2011, 15:15 | #3 |
Участник
|
Вешать свой код с логгированием и записью стека на Application.ttsNotify*() и отслеживать по нему, что происходит
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: Logger (3), denni (1). |
12.09.2011, 15:37 | #4 |
Участник
|
Цитата:
Еще при логировании удобно использовать вызов appl.curTransactionId(true) Т.е. можно логировать транзакции оп их номерам и легко находить те из них которые не завершались. Ну и плюс эти же номера попадают в CreatedTransactionId / ModifiedTransactionId |
|
12.09.2011, 15:44 | #5 |
Участник
|
Спасибо участникам. В принципе, думал о логгировании, смущало только одно - был уверен на все 100%, что Ах не даст открыть форму во время транзакции (будет постоянно ругаться)... Проведу "тотальную" проверку кода + поставлю лог. О результатах отпишусь
|
|
12.09.2011, 15:46 | #6 |
Участник
|
Может это и не форма виновата.
|
|
12.09.2011, 15:53 | #7 |
Участник
|
Имел ввиду, что если транзакция неокончена (по различным причинам) система не даст открыть другую форму, закрыть открытую...
|
|
12.09.2011, 16:17 | #8 |
Участник
|
Цитата:
Например, см. Ошибка при вызове диалога, но это было давно, возможно что-то изменилось |
|