28.06.2013, 07:59 | #1 |
Участник
|
Анализатор незакрытых транзакций
У нас нередко возникала проблема с незакрытыми транзакциями (непарные 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% Интересно, какие результаты получатся у Вас. |
|
|
За это сообщение автора поблагодарили: Logger (10), Raven Melancholic (1), alex55 (3), imir (2). |
Теги |
ttscomit, best practice |
|
|