AXForum  
Zurück   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 07.10.2021, 15:31   #1  
Perc ist offline
Perc
Участник
 
198 / 57 (2) ++++
Registriert seit: 05.03.2005
Как найти вызов ttsBegin
Пользователь работает и где-то код криво отрабатывает и возникает незакрытая транзакция. У пользователя разнесся журнал ГК. Потом он видит что все глючит, кнопки не работают. Перезаходит - журнала нет.

Работает с журналом ГК, сопоставления ручные, отчеты попутно смотрит. Возникает 1-2 раза в день и не каждый день. От нее добиться последовательность глюка не могу. Сидеть с ней тоже. Вижу уже итог.
Хотел настроить логирование для нее, чтобы поймать момент ttabegin, ttscommit.
Добавил код в Apllication \ ttsNotifyAbort, ttsNotifyCommit,ttsNotifyPostBegin. И с помощью xSession::xppCallStack() хочу стэк вызовов последнего не закрытого ttsBegin найти. Но там только:
X++:
(S)\Classes\Test\logAdd 18
(S)\Classes\Application\ttsNotifyPostBegin 6
Т.е. откуда это пришло вообще не понять..
Просто смотреть код вокруг объектов которые пользователь якобы использовал в последние минуты - на вскидку не помогло..

Есть у кого-то опыт поиска источника подобных проблем?

Дакс4.
Alt 07.10.2021, 15:46   #2  
S.Kuskov ist offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3.450 / 1792 (66) ++++++++
Registriert seit: 28.04.2007
Ort: Калуга
Zitat:
Zitat von Perc Beitrag anzeigen
Но там только:
X++:
(S)\Classes\Test\logAdd 18
(S)\Classes\Application\ttsNotifyPostBegin 6
Т.е. откуда это пришло вообще не понять.
Поймать стек вызова у долгой транзакции.
Попробуйте в параметрах AOS включить точки останова на уровне сервера
Alt 07.10.2021, 15:59   #3  
S.Kuskov ist offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3.450 / 1792 (66) ++++++++
Registriert seit: 28.04.2007
Ort: Калуга
Анализатор незакрытых транзакций
Alt 11.10.2021, 05:08   #4  
Perc ist offline
Perc
Участник
 
198 / 57 (2) ++++
Registriert seit: 05.03.2005
Zitat:
Zitat von S.Kuskov Beitrag anzeigen
Поймать стек вызова у долгой транзакции.
Попробуйте в параметрах AOS включить точки останова на уровне сервера
Да, посмотрел тему. У людей такая же проблема со стеком вызовов. При вызове tts с клиента - источник не отслеживается..
Кстати заметил разницу при вызове xSession::xppCallStack() на клиенте и на сервере. При вызове с клиента иногда более информативно получается, но в моей проблеме не помогло.

Точки останова само собой включены.

Попробую еще модальным окном остановить работу пользователя. Чтобы он позвонил и сказал что он нажимал в последний раз..

А нет, так подумываю уже о временной возможности тотальной замены всех ttsbegin на вызов ttsbegin с серверной процедуры)
Alt 11.10.2021, 05:18   #5  
Perc ist offline
Perc
Участник
 
198 / 57 (2) ++++
Registriert seit: 05.03.2005
От отсутствия вариантов попробовал и представленный анализатор. Предупреждений он навалил достаточно конечно. Но там все не существенно.

Ошибок - 95% не справился с методами в которых есть синтаксис clr.(обработка под 3-ку делалась) А остальные десяток мест из кого-то заброшенного функционала который уже нигде и никем у нас не используется. Выявился один рабочий отчет с return между tts. Но по факту оказалось, что тоже не рабочее место..
Alt 11.10.2021, 07:03   #6  
Logger ist offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
4.001 / 3298 (118) ++++++++++
Registriert seit: 12.10.2004
Ort: Москва
Blog-Einträge: 2
В аксапте была табличка лога sysutilelementslog или как то так.
Там логировалис используемые юзером формы и очеты.
Несложной доработкой можно обобщить до классов.
Тем самым еще сузить область поисков.
Alt 11.10.2021, 08:21   #7  
Perc ist offline
Perc
Участник
 
198 / 57 (2) ++++
Registriert seit: 05.03.2005
Zitat:
Zitat von Logger Beitrag anzeigen
В аксапте была табличка лога sysutilelementslog или как то так.
Там логировалис используемые юзером формы и очеты.
Несложной доработкой можно обобщить до классов.
Тем самым еще сузить область поисков.
В четверке нет такого логирования. Ну да ладно.. посмотрим в версии выше..

Несложной это какой? за созданием форм слежение из \xClassFactory\formRunClass сделано. Как бэ системой поддерживается..
А класс на что зацепится?
Alt 11.10.2021, 09:46   #8  
Logger ist offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
4.001 / 3298 (118) ++++++++++
Registriert seit: 12.10.2004
Ort: Москва
Blog-Einträge: 2
Zitat:
Zitat von Perc Beitrag anzeigen
А класс на что зацепится?
Я в 4-ку перетаскивал из 2009-й
Еще добавил тут
\Classes\RunBase\new
\Classes\ClassFactory\createClass

помогает для Runbase а также для всего что по менюитем запускается. Конечно это не все классы охватывает но очень многое.
Также можно вот это применить
это одна из идей, которую я хочу пропихнуть в АХ 2012.

Ошибка с транзакциями!
Alt 01.11.2021, 12:25   #9  
Perc ist offline
Perc
Участник
 
198 / 57 (2) ++++
Registriert seit: 05.03.2005
В итоге xSession::xppCallStack() оказался совершенно бесполезным в поиске проблемы.
Самым простым и действенным получилось в onEventGoingIdle показать модальное окно после проверки ttsLevel. С третьей попытки пользователь таки прочитал сообщение и позвонил)

Проблема была на форме LedgerJournalTable. Ктото у нас на modified одного из полей сделал LedgerJournalTable_ds.write(). А во write на форме:
X++:
    ttsbegin;
    super();
    journalFormTable.datasourceWritePost();
    ttscommit;
Одно из обязательных полей таблицы было не заполнено. Поэтому в validateWrite() в super() аксапта поднимает какое то странное исключение с типом Warning. При этом код в validateWrite() доделывается, а все что было выше по стэку бросается, и транзакция еще не откатывается. В итоге имеем ttslevel=1. Далее пользователь умудряется все корректно заполнить, создать строки и разнести журнал. Потом аскапта совсем уж начинает сопротивляться, пользователь перезапускается - но журнала который он видел разнесенным, уже нет)
По мне write() в коде не выглядит каким то уж криминалом. А вот реакция системы с бросанием кода, но без отката транзакции - непонятно.. Предполагается что? Написать еще дополнительно проверку validateWite перед wite?
This post has been rated by: S.Kuskov (5).
Alt 01.11.2021, 13:32   #10  
Logger ist offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
4.001 / 3298 (118) ++++++++++
Registriert seit: 12.10.2004
Ort: Москва
Blog-Einträge: 2
Zitat:
Zitat von Perc Beitrag anzeigen
Написать еще дополнительно проверку validateWite перед wite?
Почему нет. Неплохой вариант. Ну еще try catch добавить.
Alt 01.11.2021, 14:25   #11  
Perc ist offline
Perc
Участник
 
198 / 57 (2) ++++
Registriert seit: 05.03.2005
Zitat:
Zitat von Logger Beitrag anzeigen
Почему нет. Неплохой вариант. Ну еще try catch добавить.
Да все это выглядит как ересь. Затыкание багов(фитчей) ядра. По мне LedgerJournalTable_ds.write() уже должно включать весь сервис. Оно и включает, но как-то "не так". Или должна быть функция у DS которая аналог Ctrl+S.

Кстати вместо LedgerJournalTable_ds.write() я написал element.task(#taskSave) и все заработало аналогично Ctrl+S. Тогда сначала formRun запускает validateWrite, а потом только write. И тогда все срабатывает более менее адекватно.

Но по итого приходится разобраться зачем все это писали, и видимо вынесу ваще все что хотели сделать на update таблицы. И дело с концом..

Но в любом случае, работа исключений в validateWrite на форме - подкинула нежданчик..

Geändert von Perc (01.11.2021 um 14:32 Uhr)
This post has been rated by: Logger (3).
Alt 01.11.2021, 14:49   #12  
Pandasama ist offline
Pandasama
Участник
 
473 / 140 (5) +++++
Registriert seit: 11.08.2014
Ort: Барнаул
Не понятно, где тут баг ядра, если источник проблемы в том что-то у вас в modified написал .write() - что делать, в целом, не стоит никогда.
Alt 01.11.2021, 15:11   #13  
Perc ist offline
Perc
Участник
 
198 / 57 (2) ++++
Registriert seit: 05.03.2005
Zitat:
Zitat von Pandasama Beitrag anzeigen
у вас в modified написал .write() - что делать, в целом, не стоит никогда.
А это откуда такой смелый вывод?
Принципиальной разницы нет - modified, clicked...
Почему DS.executeQuery() можно написать, а DS.write() нельзя?
DS.write() незримо написан на любой кнопке со свойством SaveRecord=Yes

Какие нерушимые принципы нарушены таким вызовом? Надо пояснять.. а так это блабла.. извините)
Alt 01.11.2021, 15:30   #14  
Pandasama ist offline
Pandasama
Участник
 
473 / 140 (5) +++++
Registriert seit: 11.08.2014
Ort: Барнаул
Это, конечно, оффтоп, но на мой взгляд вешать логику сохранения ЛЮБОЙ (не обязательно текущей) записи в событие modified поля - это отвратительный дизайн.
Хуже только вешать в событии validateField.
Alt 01.11.2021, 16:11   #15  
Perc ist offline
Perc
Участник
 
198 / 57 (2) ++++
Registriert seit: 05.03.2005
Zitat:
Zitat von Pandasama Beitrag anzeigen
Это, конечно, оффтоп, но на мой взгляд вешать логику сохранения ЛЮБОЙ (не обязательно текущей) записи в событие modified поля - это отвратительный дизайн.
Хуже только вешать в событии validateField.
У меня нет претензий к тому чтобы считать, что это плохой дизайн. У меня претензия к тому что вы очень быстро связали мою изначальную ошибку незакрытого ttsBegin с якобы плохим дизайном. И прикопались к modified.. такая проблема выскочит при программном вызове DS.write() из любого места.
Alt 01.11.2021, 23:15   #16  
S.Kuskov ist offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3.450 / 1792 (66) ++++++++
Registriert seit: 28.04.2007
Ort: Калуга
Zitat:
Zitat von Perc Beitrag anzeigen
Одно из обязательных полей таблицы было не заполнено. Поэтому в validateWrite() в super() аксапта поднимает какое то странное исключение с типом Warning.
Зачем вообще validateWrite бросает исключение? Разве он не должен просто вернуть false
Alt 02.11.2021, 07:25   #17  
Perc ist offline
Perc
Участник
 
198 / 57 (2) ++++
Registriert seit: 05.03.2005
Zitat:
Zitat von S.Kuskov Beitrag anzeigen
Зачем вообще validateWrite бросает исключение? Разве он не должен просто вернуть false
ну так а что системе еще делать? validateWrite система сама вызвала в супере write. validateWrite вернул false - поле обязательное не заполнено. Проверял - поднимается
исключение типа info, выполнение обрывается, транзакция не откатывается системой. Но при этом если запихать вызов ds.write в try catch - то в catch ловится ttslevel уже ноль. Т.е. чтобы система сама откатила транзакцию достаточно поместить вызов в try. Это в 4-ке.
В 12-ке проверил - такой проблемы нет. Точно в таком же случае - транзакция абортируется в любом варианте.

Посмотрел стандартный sys-код в 4ке в этой же форме. MS проблему учитывали и писали с validateWrite:
X++:
void fieldModifiedBlockUserGroupId()
{
    if (! journalTable_ds.validateWrite())
        return;

    journalTable_ds.write();
    journalTable_ds.refresh();
}
этот метод они вызывают в modified поля формы.
This post has been rated by: sukhanchik (2).
Alt 02.11.2021, 08:12   #18  
Pandasama ist offline
Pandasama
Участник
 
473 / 140 (5) +++++
Registriert seit: 11.08.2014
Ort: Барнаул
Zitat:
поднимается исключение типа info
где поднимается? в super() validateWrite ? или явно throw info в validateWrite, которое не прерывает транзакцию?
Alt 02.11.2021, 09:37   #19  
Perc ist offline
Perc
Участник
 
198 / 57 (2) ++++
Registriert seit: 05.03.2005
Zitat:
Zitat von Pandasama Beitrag anzeigen
где поднимается? в super() validateWrite ? или явно throw info в validateWrite, которое не прерывает транзакцию?
\Data Dictionary\Tables\LedgerJournalTable\Methods\validateWrite
\Classes\FormDataSource\validateWrite
\Forms\LedgerJournalTable\Data Sources\LedgerJournalTable\Methods\validateWrite
\Classes\FormDataSource\write
\Forms\LedgerJournalTable\Data Sources\LedgerJournalTable\Methods\write

В validateWrite таблицы вызывается super() который возвращает false. Там еще дальше есть код - он весь проходит до конца. И вот после return false уже больше ничего не выполняется- управление отдается среде. И теперь ttslevel = 1.
Alt 02.11.2021, 10:08   #20  
Pandasama ist offline
Pandasama
Участник
 
473 / 140 (5) +++++
Registriert seit: 11.08.2014
Ort: Барнаул
validateWrite возвращает false - всё ОК, нормальное поведение.
Тогда непонятно, где вот это происходит.
Zitat:
Поэтому в validateWrite() в super() аксапта поднимает какое то странное исключение с типом Warning.
Zitat:
Проверял - поднимается
исключение типа info, выполнение обрывается, транзакция не откатывается системой
Беда с транзакцией-то откуда? почему ttscommit не выполняется в
X++:
ttsbegin;
super();
journalFormTable.datasourceWritePost();
ttscommit;
Или у вас по непонятным причинам return false в validateWrite не выполняет как раз корректно, и вместо выхода из метода и перехода в следующий - идет передача управления пользовательскому интерфейсу (со все ещё открытой транзакцией)?
Stichworte
стек вызовов, транзакции

 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
ttsbegin и зацикливание While select Perc DAX: Программирование 4 21.11.2014 08:55
Win2008 и вызов методов COM-объектов AndyD DAX: Программирование 13 06.02.2012 15:22
Падает стандартный импорт с ошибкой "Вызов ttscommit без вызова ttsbegin" skof DAX: Администрирование 6 19.01.2012 17:12
dynamics-ax-dev: CLR Errors & ttsbegin/ttscommit Blocks Blog bot DAX Blogs 0 02.11.2010 18:05
ttsbegin ttscommit and changecompany() Volodymyr DAX: Программирование 9 29.08.2008 15:36

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 12:19 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.