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 28.06.2013, 07:59   #1  
Ярослав Щекин ist offline
Ярослав Щекин
Участник
 
78 / 174 (6) ++++++
Registriert seit: 16.03.2009
Анализатор незакрытых транзакций
У нас нередко возникала проблема с незакрытыми транзакциями (непарные ttsbegin/ttscommit). Мы пытались их устранять, искали и исправляли код с такими ошибками, но это было медленно и не очень успешно.

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

Программа предназначена для Ax 3.0, (но, наверное, будет работать и с другими версиями Axapta, но с худшими результатами) и обрабатывает .xpo-файлы (но job-ы не обрабатываются). Принцип работы простой: считается, что все открытые в методе транзакции должны быть в нём закрыты. Вообще программа использует набор эвристик, из-за чего могут быть как ложноположительные, так и ложноотрицательные результаты. В частности, циклы обрабатываются очень приблизительно. Кроме того, макросы программа не раскрывает, а просто "угадывает", что там могло быть (синтаксически).

Как пользоваться:
1. Эскпортируете объекты в какой-нибудь файл.xpo.
2. В cmd.exe или его аналоге (analyzer --- консольное приложение):
> analyzer.exe этот_файл.xpo > result.txt
3. Упорно ждёте завершения обработки, затем анализируете result.txt.

Если хотите попробовать на новых версиях Dynamics AX, то указывайте кодировку обрабатываемых файлов, например:
> analyzer.exe aot.xpo utf-8 > aot_result.txt

При сбоях в работе анализатора выдаются такие сообщения:

. Parse error. Token <x> in block <y>, state <z>
Данное сообщение означает, что произошёл сбой синтаксического анализатора, при этом указанный метод НЕ анализируется. Пример:

public void insert()
{
if if(!this.ABCCalcJourID) ttscommit;

\Tables\ABCCalcJour\insert, line 3:
-- Parse error. Token <if> in block <CondExpr>, state <Start>

. !ParseWarning: Unrecognized command (something)
Данные сообщения означают, что выявлена неизвестная анализатору команда или слово, открывающее блок. Анализ при этом продолжается.

Выявляемые предупреждения:
. 'break' is used outside of a loop or switch!
. 'continue' is used outside of a loop!
-- использование break/continue вне циклов/switch-ей.
. 'ttsabort' inside 'catch' is useless!
-- ttsabort внутри catch бесполезен (в нашей Ax 3.0/MSSQL это так).
. multiple ttsbegin/ttscommit pairs in linear block!
-- несколько транзакций в линейном блоке, обычно это ошибка.

Выявляемые ошибки:
. 'try' is useless inside transaction!"
-- try внутри транзакции бесполезен (в нашей Ax 3.0/MSSQL это так).
. 'return' with incorrect ttslevel!
-- выход из метода с некорректным уровнем tts.
. ttslevel<0!
. unpaired transaction!

-------------------------------------------------
В нашем случае результаты для всего AOT такие:

Время анализа: около 5 минут (313 сек).
Всего выявлено ошибок и предупреждений: 335
Из них:
Корректных ошибок и предупреждений: 286, ~85%
Формально ошибочных, но корректных (методы 'ttsbegin' и т.п.): 30, ~9%
Некорректных предупреждений: 7, ~2%
Ложноположительных результатов: 10, ~3%
Hack-ов (while (appl.ttsLevel()>0) ttscommit; ) : 2, менее 1%

Интересно, какие результаты получатся у Вас.
Angehängte Dateien
Dateityp: zip analyzer.zip (737,1 KB, 157x aufgerufen)
This post has been rated by: Logger (10), Raven Melancholic (1), alex55 (3), imir (2).
Alt 28.06.2013, 08:31   #2  
Logger ist offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
4.004 / 3299 (118) ++++++++++
Registriert seit: 12.10.2004
Ort: Москва
Blog-Einträge: 2
Это конечно круто.

Но если вам приходится прибегать к таким ухищрениям, то какое же наследство вы разгребаете
Alt 28.06.2013, 09:53   #3  
Ярослав Щекин ist offline
Ярослав Щекин
Участник
 
78 / 174 (6) ++++++
Registriert seit: 16.03.2009
Это да: "Корректных ошибок и предупреждений: 286". Из них около 40 ошибок с транзакциями в методах, которые реально используются. На этом приложении многие разрабатывали...

А Вы на своих приложениях/проектах попробовали?
Alt 28.06.2013, 10:56   #4  
Raven Melancholic ist offline
Raven Melancholic
Участник
Benutzerbild von Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2.164 / 1296 (48) ++++++++
Registriert seit: 21.03.2005
Ort: Москва-Петушки
Такую задачу решают стандартные проверки best practics. Правда по всему приложению не за 5 минут (313 сек), а за то время, которое требуется на компиляцию.
Alt 28.06.2013, 11:02   #5  
Logger ist offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
4.004 / 3299 (118) ++++++++++
Registriert seit: 12.10.2004
Ort: Москва
Blog-Einträge: 2
Zitat:
Zitat von Ярослав Щекин Beitrag anzeigen
Это да: "Корректных ошибок и предупреждений: 286". Из них около 40 ошибок с транзакциями в методах, которые реально используются. На этом приложении многие разрабатывали...

А Вы на своих приложениях/проектах попробовали?
Нет.
Мы настолько все не запускали.

У нас другое развлечение было - диалоги в транзакциях.
Ну это легко отлавливается.
Alt 28.06.2013, 11:11   #6  
Ярослав Щекин ist offline
Ярослав Щекин
Участник
 
78 / 174 (6) ++++++
Registriert seit: 16.03.2009
А у Вас какая версия Axapta?
Я вот беру код типа:
------
X++:
ttsbegin;

if (!inventTable.AFPGroupId) {
   if (cry) warning(strfmt("@KCL2642", inventTable.ItemId));
   return;
   }

while select AFPGroupLines
            where AFPGroupLines.GroupId == inventTable.AFPGroupId {
            AFPUnit::createUnit(inventTable.ItemId, AFPGroupLines.InventLocationId, _combination);
        }
ttscommit;
----
Запускаю проверку Best Practices, и никаких предупреждений не вижу.
Alt 28.06.2013, 11:14   #7  
Ярослав Щекин ist offline
Ярослав Щекин
Участник
 
78 / 174 (6) ++++++
Registriert seit: 16.03.2009
Zitat:
Zitat von Logger Beitrag anzeigen
Нет.
Мы настолько все не запускали.
А откуда Вы знаете?
Я вот тоже до проверки думал, что у нас таких ошибок пара-тройка, ну максимум 5, а не около 40.
Alt 28.06.2013, 11:34   #8  
Logger ist offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
4.004 / 3299 (118) ++++++++++
Registriert seit: 12.10.2004
Ort: Москва
Blog-Einträge: 2
Возможно я слишком самонадеян.
Попробую прогнать вашим инструментом.
Alt 28.06.2013, 12:43   #9  
Pustik ist offline
Pustik
Участник
 
807 / 372 (14) ++++++
Registriert seit: 04.06.2004
Да, и у нас встречалась пара - тройка таких косяков. Поскольку у нас ничего критичного(кроме неудобства) не происходило, остановились на том, что джобик с одной строчкой ttsabort; всегда есть под рукой.
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Alt 28.06.2013, 13:23   #10  
db ist offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Registriert seit: 01.04.2004
Ort: Москва
Zitat:
Zitat von Pustik Beitrag anzeigen
Да, и у нас встречалась пара - тройка таких косяков. Поскольку у нас ничего критичного(кроме неудобства) не происходило, остановились на том, что джобик с одной строчкой ttsabort; всегда есть под рукой.
Ну по всякому бывает. Бывает что не сильно критично, а бывает что и очень даже. На моей памяти был косяк когда пакетник в трешке несколько суток импортировал из внешней системы документы и справочники. Из за вставленного кем-то посреди метода return всё это накопилось в очень длинные транзакции, "завершившиеся" только когда на оракловой базе в логах кончилось место вместе с вполне логичным откатом всего нажитого за эти дни
Alt 28.06.2013, 14:06   #11  
Pustik ist offline
Pustik
Участник
 
807 / 372 (14) ++++++
Registriert seit: 04.06.2004
Zitat:
Zitat von db Beitrag anzeigen
Ну по всякому бывает. Бывает что не сильно критично, а бывает что и очень даже. На моей памяти был косяк когда пакетник в трешке несколько суток импортировал из внешней системы документы и справочники. Из за вставленного кем-то посреди метода return всё это накопилось в очень длинные транзакции, "завершившиеся" только когда на оракловой базе в логах кончилось место вместе с вполне логичным откатом всего нажитого за эти дни
Согласен, конечно. Я поэтому и отметил что "у нас". Наверняка, еще какие-нибудь каверзные случаи бывают, которые увидишь только тогда, когда на такие грабли наткнешься.
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Alt 29.06.2013, 16:53   #12  
Raven Melancholic ist offline
Raven Melancholic
Участник
Benutzerbild von Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2.164 / 1296 (48) ++++++++
Registriert seit: 21.03.2005
Ort: Москва-Петушки
Zitat:
Zitat von Ярослав Щекин Beitrag anzeigen
А у Вас какая версия Axapta?
Я вот беру код типа:
...
Запускаю проверку Best Practices, и никаких предупреждений не вижу.
У нас DAX4. Я немного поторопился, заявив, что задачу решают стандартные проверки best practics. Посмотрел текущий метод проверки и не нашел того, что подразумевал. Стандарт просто тупо подсчитывает соответствие количества ttsBegin и ttsCommit в пределах одного метода.То есть он даже пропустит вариант написания:
X++:
ttsCommit;
... 
ttsBegin;
В общем, даже порядок вызова транзакций стандарт не отслеживает, не говоря уже про выход посреди транзакции при помощи return, break и continue.
Просто когда-то на одной из прошлых работ я расширял BP по поводу парности ttsBegin/ttsCommit таким образом, чтобы проверялось не только количество, но и порядок и наличие между началом и подтверждение транзакции возвратов, прерываний, продолжений (в этом случае выдавал не ошибку или предупреждение, а просто сообщение, поэтому ловилось только при определенной настройке BP). За давностью лет решил, что это и есть стандарт.
Ладно, вспомню что тогда делал и добавлю в наше приложение. А Вам рекомендую вписать Вашу проверку в метод checkSource класса SysBPCheckMemberFunction. В этом случае не нужно будет что-то выгружать в проекты, а контролировать все это дело в рамках текущей разработки.
Alt 04.07.2013, 14:37   #13  
Ярослав Щекин ist offline
Ярослав Щекин
Участник
 
78 / 174 (6) ++++++
Registriert seit: 16.03.2009
Zitat:
Zitat von Logger Beitrag anzeigen
Возможно я слишком самонадеян.
Попробую прогнать вашим инструментом.
Ну что, попробовали? Есть какие-то результаты?
Alt 15.07.2013, 12:44   #14  
dech ist offline
dech
Участник
Benutzerbild von dech
Самостоятельные клиенты AX
 
650 / 352 (13) ++++++
Registriert seit: 25.06.2009
Ort: Омск
Blog-Einträge: 3
Мощно конечно, но если возникают такие вещи в коде, напрашивается вопрос: Вы вообще рефакторинг делаете? Разбив сложный метод с транзакциями на несколько простых, можно все-таки транзакции вычленить примерно в такую форму:
X++:
void complexMethod()
{
    ttsbegin;
    simpleMethods();
    ttscommit;
}
__________________
// no comments
Alt 15.07.2013, 13:38   #15  
Ace of Database ist offline
Ace of Database
Участник
Benutzerbild von Ace of Database
 
877 / 649 (23) +++++++
Registriert seit: 14.10.2004
В любом приложении должен быть на первом месте такой джоб
X++:
static void aaa_ttscommit(Args _args)
{
    ;
    info(int2str(appl.ttsLevel()));
    while (appl.ttsLevel())
        ttscommit;
}
Alt 15.07.2013, 19:41   #16  
Ярослав Щекин ist offline
Ярослав Щекин
Участник
 
78 / 174 (6) ++++++
Registriert seit: 16.03.2009
Zitat:
Zitat von dech Beitrag anzeigen
Мощно конечно, но если возникают такие вещи в коде, напрашивается вопрос: Вы вообще рефакторинг делаете?
Бывает. Но к нашей Axapta многие приложили руки, и непонятно, что и когда рефакторить. Вы на своём/своих приложениях попробовали, кстати?
Alt 16.07.2013, 07:37   #17  
dech ist offline
dech
Участник
Benutzerbild von dech
Самостоятельные клиенты AX
 
650 / 352 (13) ++++++
Registriert seit: 25.06.2009
Ort: Омск
Blog-Einträge: 3
Zitat:
Zitat von Ярослав Щекин Beitrag anzeigen
Вы на своём/своих приложениях попробовали, кстати?
Попробовал на АХ3 и АХ4, пишет ошибку:

invalid command name "Exportfile"
while executing
"Exportfile for AOT version 1.0 or later"
Angehängte Dateien
Dateityp: xpo _TestTTS.xpo (1,4 KB, 494x aufgerufen)
__________________
// no comments
Alt 16.07.2013, 09:37   #18  
Ярослав Щекин ist offline
Ярослав Щекин
Участник
 
78 / 174 (6) ++++++
Registriert seit: 16.03.2009
Zitat:
Zitat von dech Beitrag anzeigen
Попробовал на АХ3 и АХ4, пишет ошибку:

invalid command name "Exportfile"
while executing
"Exportfile for AOT version 1.0 or later"
А у меня работает на этом файле. А как Вы запускаете (какая командная строка, с локального или сетевого диска), какая у Вас операционная система?
Alt 16.07.2013, 10:29   #19  
dech ist offline
dech
Участник
Benutzerbild von dech
Самостоятельные клиенты AX
 
650 / 352 (13) ++++++
Registriert seit: 25.06.2009
Ort: Омск
Blog-Einträge: 3
Zitat:
Zitat von Ярослав Щекин Beitrag anzeigen
А у меня работает на этом файле. А как Вы запускаете (какая командная строка, с локального или сетевого диска), какая у Вас операционная система?
Windows 7, папка "Мои документы". Запускаю через FAR. Но я думаю, не в этом дело.
Просто, если он уже читает первую строчку "Exportfile for AOT version 1.0 or later" и пишет, что это invalid command, то вам надо смотреть в сторону обработки строк.
__________________
// no comments
Alt 16.07.2013, 11:32   #20  
Ярослав Щекин ist offline
Ярослав Щекин
Участник
 
78 / 174 (6) ++++++
Registriert seit: 16.03.2009
Zitat:
Zitat von dech Beitrag anzeigen
Windows 7, папка "Мои документы". Запускаю через FAR. Но я думаю, не в этом дело.
Просто, если он уже читает первую строчку "Exportfile for AOT version 1.0 or later" и пишет, что это invalid command, то вам надо смотреть в сторону обработки строк.
Нет, не нужно, дело не в этом. А вы под администратором запускаете или нет? А что будет, если просто запустить analyzer.exe без параметров? А если скопировать в корень какого-нибудь диска и запустить оттуда?

И ещё, можете попробовать версию из вложенного файла?
Angehängte Dateien
Dateityp: zip analyzer.zip (737,0 KB, 139x aufgerufen)

Geändert von Ярослав Щекин (16.07.2013 um 11:38 Uhr)
Stichworte
ttscomit, best practice

 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Чтение только завершенных транзакций. raz DAX: Программирование 4 19.05.2017 10:20
Неверный откат сопоставленных транзакций sgt.Pepper DAX: Программирование 4 17.01.2008 09:16
IMTS (Система множественных складских транзакций) yuranio DAX: Функционал 7 04.03.2005 17:56
Какая связь между Сводным планированием и Система множественных складских транзакций Wamr DAX: Функционал 6 27.09.2004 17:03
Очень частая фиксация транзакций - без этого никак? avzh DAX: Программирование 10 12.07.2004 10:35

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 17:26 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.