AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Функционал
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.09.2009, 11:41   #1  
Helm is offline
Helm
Участник
 
15 / 11 (1) +
Регистрация: 24.09.2009
Разноски, блокировки и NumberSeq
Господа, доброго дня!
Аксапта тройка.
Симптомы такие: для нескольких заказов при попытке разносок вешается намертво система, создаются два доступа к таблице NumberSequenceTable, один блочит другого.
Происходит это в классе NumberSeqCleanUp в методе cleanUpSequence в этом запросе
X++:
select forupdate firstonly numberSequenceTableUpd
    index hint SeriesIdx
    where numberSequenceTableUpd.numberSequence == _numberSequenceTable.numberSequence;
Проблема была описана Здесь и Здесь Однако перепись метода release в NumberSeq не помогает банально потому, что туда код не заходит.
Происходит впервые, раньше не было такого как говорят, что согласуется со старыми топиками (работаю второй день на месте, впервые вижу проблемы с проводками такого класса).

Помимо этого ещё появился глюк.
При создании отгрузочной накладно процесс проходит, ничего не виснет, однако в проводках и в соответствующей таблице пустота.

Ниже весь код, по-моему он оригинальный
X++:
public void cleanUpSequence(UserConnection         userConnection,
                     NumberSequenceTable    _numberSequenceTable,
                     boolean                hookCleanUp = false
                    )
{
    NumberSequenceList      numberSequenceList;
    NumberSequenceTable     numberSequenceTableUpd;
    boolean                 doCleanUpDead   = FALSE;

    if (_numberSequenceTable && _numberSequenceTable.continuous)
    {
        userConnection.ttsbegin();

        numberSequenceTableUpd.setConnection(userConnection);

        select forupdate firstonly numberSequenceTableUpd
            index hint SeriesIdx
            where numberSequenceTableUpd.numberSequence == _numberSequenceTable.numberSequence;

        if (numberSequenceTableUpd && (!hookCleanUp || numberSequenceTableUpd.mustRunCompleteCleanUp()))
            numberSequenceTableUpd.updateCompleteClean();

        while select transId
            from numberSequenceList
            group by transId
            where numberSequenceList.numberSequence == _numberSequenceTable.numberSequence
        {
            if (!numberSequenceList.transId)
                doCleanUpDead = TRUE;
            this.cleanUpTrans(userConnection,numberSequenceList.transId);
        }
        if (doCleanUpDead)
            this.cleanupDeadProc(userConnection,_numberSequenceTable.numberSequence);

        userConnection.ttscommit();
    }
}
P.S. Перенесите, пожалуйста, топик, сглючило(

Последний раз редактировалось Helm; 25.09.2009 в 11:53.
Старый 25.09.2009, 12:09   #2  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
А в чем вопрос ?

Хотите поймать глючное место ? Включите логирование долгих запросов.
Дождитесь такого зависания, подождите минутку для верности, грохните одну из сессий на уровне SQL.

Для второй сессии в логе длинных запросов увидите стек вызовов и прочие удобства для анализа ситуации.

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

А дальше уже смотреть по обстоятельствам.
Старый 25.09.2009, 12:18   #3  
Helm is offline
Helm
Участник
 
15 / 11 (1) +
Регистрация: 24.09.2009
Место-то я нашёл. Вопросы классические отечественные: что делать и кто виноват
Проблема как бы разбиралась, но не до конца... причём в одном топике всё закончилось на посте с аналогичной ситуацией.
Старый 25.09.2009, 12:19   #4  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Проблема может быть не только в методе release()
Могут быть и другие места. В фактурах например было место аналогичное.
Старый 25.09.2009, 12:23   #5  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Helm Посмотреть сообщение
Место-то я нашёл. Вопросы классические отечественные: что делать и кто виноват
Проблема как бы разбиралась, но не до конца... причём в одном топике всё закончилось на посте с аналогичной ситуацией.
Ну если нашли место то здесь в комментариях
Блокировка NumberSequence
к исправлениям в коде, пояснен принцип исправлений.

Я думаю у вас нечто схожее.

Т.е. основным соединением, в котором идут транзакции, выбираются forupdate записи из numberSequenceTable и прочих таблиц. А нужно использовать вновь открываемое соединение к базе, тогда эта таблица надолго блокироваться не будет и не будет блокировок и тупиковых ситуаций.
Старый 25.09.2009, 13:24   #6  
Helm is offline
Helm
Участник
 
15 / 11 (1) +
Регистрация: 24.09.2009
Я извиняюсь за нупский вопрос, но как алгоритмически это сделать? Я просто раньше не сталкивался толком с UserConnect, да и полугодовой перерыв в работе даёт знать, к сожалению.

Вcё происходит в классе NumberSeqCleanUp
В методе ран создаёт(только создаются) user connection, далее в нём просто вызывается
X++:
this.cleanUpSequence(userConnection,numberSequenceTableClean);
В самом cleanUpSequence делается
X++:
userConnection.ttsbegin();
numberSequenceTableUpd.setConnection(userConnection);

select forupdate firstonly numberSequenceTableUpd
index hint SeriesIdx
where numberSequenceTableUpd.numberSequence == _numberSequenceTable.numberSequence;
На этом селекте зависает. Дальше идут ещё обращения к другим методам с использованием всё того же UserConnection из run, но это дело десятое, если тут понять.

В примере с Release всё понятно, там были просто ttsbegin-commit и добавлялся connection внутрь их. А здесь как-то неясно мне, подскажите, пожалуйста!
Старый 25.09.2009, 13:58   #7  
Helm is offline
Helm
Участник
 
15 / 11 (1) +
Регистрация: 24.09.2009
Ещё выяснилась подробность, что оказывается это не в первый раз, а уже бывало когда-то. И тогда лечилось брутфорсом в виде 20-30-кратного создания заказа, пока не удавалось провести разноску. Что только подтверждает данный баг... но конечно так лечить каждый раз не айс
Старый 25.09.2009, 14:38   #8  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
то что у вас вешается cleanUpSequence не причина, а следствие.
Надо найти место где данная номерная серия изменяется и не отпускается (не происходит commit транзакции)
Возможно, в целях какой-то оптимизации у вас там в начале цикла ручками выделяется кусок серии.
За это сообщение автора поблагодарили: Logger (1), Helm (1).
Старый 28.09.2009, 12:49   #9  
Helm is offline
Helm
Участник
 
15 / 11 (1) +
Регистрация: 24.09.2009
Спасибо большое! Помогло
Старый 28.09.2009, 14:33   #10  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Helm Посмотреть сообщение
Спасибо большое! Помогло
Интересно, а в чем была проблема ?
Старый 28.09.2009, 16:05   #11  
Helm is offline
Helm
Участник
 
15 / 11 (1) +
Регистрация: 24.09.2009
Я сам не понял, вылечилось шаманством в итоге.
Ошибка вылетала в результате попытки вставить уже имеющую строку в numberSequenceList, поиск по этой таблице глюкал почему-то. Вместо использования метода из NumberSeq зачем-то брался метод-наследник из NumberSeq_fast, который не должен был вообще ни с какого бока-припёка быть, и он возвращал пустую строку.
Я просто закомментил строку с этим Insert'-ом, прогнал, сделал нужные фактуры. После чего убрал комментарий, решил ещё прогнать и всё вылечилось, заработало, т.к. стало использовать нужный метод.
Старый 28.09.2009, 16:25   #12  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Helm Посмотреть сообщение
Я сам не понял, вылечилось шаманством в итоге.
Ошибка вылетала в результате попытки вставить уже имеющую строку в numberSequenceList, поиск по этой таблице глюкал почему-то. Вместо использования метода из NumberSeq зачем-то брался метод-наследник из NumberSeq_fast, который не должен был вообще ни с какого бока-припёка быть, и он возвращал пустую строку.
Я просто закомментил строку с этим Insert'-ом, прогнал, сделал нужные фактуры. После чего убрал комментарий, решил ещё прогнать и всё вылечилось, заработало, т.к. стало использовать нужный метод.
Это иногда в приложении связи глюкают. Я обычно класс сносил и заново импортил из xpo.

Можно еще индексы пересоздать.
Теги
блокировка, разноска, number sequence

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
блокировки таблицы WMTRANSFER_FACTUREJOUR. ipas DAX: Администрирование 0 29.09.2008 15:20
Ax 4.0. Главная книга.План Счетов. Счет. Разноска. Тип разноски nmariya DAX: Функционал 2 30.10.2007 13:19
Сопоставление с разными профилями разноски и одинаковой валютой операции Red Stranger DAX: Функционал 13 27.06.2006 18:40
Вопрос по профилям разноски ОС treeny DAX: Функционал 2 20.05.2005 16:02
Профиль разноски по Договрам AlexR DAX: Функционал 8 06.04.2005 17:06

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 13:29.