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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.01.2008, 13:30   #1  
Blog bot is offline
Blog bot
Участник
 
25,631 / 848 (80) +++++++
Регистрация: 28.10.2006
ax-som: Number sequnec lock
Источник: http://ax-som.blogspot.com/2008/01/n...unec-lock.html
==============

While working in multi user environment, if you are creating journal/journal line through code then you might the have the number sequence locking problem. For understanding the problem you can use following code

X++:
static void  checkNumberSeq(Args _args)
 {
     NumberSeq  numberSeq;
     Voucher  releaseVoucher;
      ;
 
      ttsbegin;
 
     numberSeq  =  NumberSeq::newGetVoucher(VendParameters::numRefVendPaymentVoucher());
      releaseVoucher = numberSeq.voucher();
      NumberSeq::release(VendParameters::numRefVendPaymentVoucher().NumberSequence,releaseVoucher);
 
      //ttscommit;
 
      //ttsbegin;
 
     numberSeq  =  NumberSeq::newGetVoucher(VendParameters::numRefVendPaymentVoucher());
      releaseVoucher = numberSeq.voucher();
 
      ttscommit;
 }
If you uncomment ttscommit/ttsbegin in the middle of this job first, it will work fine. If you comment them and run the job again, one NumberSequenceTable record gets locked, and the system hangs during second newGetVoucher() call.

This happens because standard Ax use pessimistic lock while generating new number.
To resolve this problem either you have to use newGetVoucher() out of ttsbegin/ttscommit scope.
Another way to resolve it (not thoroughly tested) is to modify method \Classes\NumberSeq\release as follows:

X++:
public static  boolean release(NumberSequenceCode  _numberSequenceCode,
                         Num                 _num
                         //#N, 1001 10/01/2008- -->
                         ,userConnection     userConnection = null
                         //#N, 1001 10/01/2008- 
      //numberSequenceTable =  NumberSequenceTable::find(_numberSequenceCode,true);
 
     if  (prmIsDefault(userConnection))
      {
          userConnection = New userConnection();
      }
 
      userConnection.ttsbegin();
      numberSequenceTable.setConnection(userConnection);
      numberSequenceList.setConnection(userConnection);
 
     select  forUpdate firstOnly numberSequenceTable
         index  hint SeriesIdx
         where  numberSequenceTable.numberSequence == _numberSequenceCode;
     //#N,  1001 10/01/2008- 
          userConnection.ttsabort();
         //#N,  1001 10/01/2008- >--
         throw  error(strFmt("@SYS26271",_numberSequenceCode));
      }
 
     if  (!numberSequenceTable.checkBlocked())
      {
         //#N,  1001 10/01/2008- -->
          userConnection.ttsabort();
         //#N,  1001 10/01/2008- >--
         throw  error("@SYS18447");
      }
 
     if  (numberSequenceTable.continuous == NoYes::No)
         ok =  TRUE;
      else
      {
          select forupdate firstonly numberSequenceList
              index hint StatIdx
              where numberSequenceList.numberSequence == _numberSequenceCode  &&
                    numberSequenceList.num            == _num;
 
         if  (numberSequenceList)
          {
              if (numberSequenceList.status == NumStatus::Free)
              {
                  ok = TRUE;
              }
              else if (numberSequenceList.status == NumStatus::Active ||  numberSequenceList.status == NumStatus::Reserved)
              {
                  if (numberSequenceList.transId)
                  {
                      numberSequenceList.status   = NumStatus::Free;
                      numberSequenceList.transId  = 0;
                      numberSequenceList.update();
 
                      select forupdate firstonly numberSequenceTTS
                          index hint TransIdIdx
                          where numberSequenceTTS.transId ==  numberSequenceList.transId;
 
                      if (numberSequenceTTS)
                          numberSequenceTTS.delete();
 
                      ok = TRUE;
                  }
                  else
                  {
                      xSession = new xSession(sessionId());
 
                      if (numberSequenceList.sessionId        == xSession.masterSessionId() ?  xSession.masterSessionId() : sessionId() &&
                          numberSequenceList.sessionLoginDate == xSession.loginDate()     &&
                          numberSequenceList.sessionLoginTime ==  xSession.loginTime())
                      {
                          numberSequenceList.status   = NumStatus::Free;
                          numberSequenceList.update();
                          ok = TRUE;
                      }
                      else
                      {
                          if (NumberSeqCleanUp::isProcessDead(numberSequenceList))
                          {
                              numberSequenceList.status   =  NumStatus::Free;
                              numberSequenceList.update();
                              ok = TRUE;
                          }
                          else
                          {
                              ok = FALSE;
                          }
 
                      }
                  }
              }
          }
          else
          {
              numberSequenceList.numberSequence    =  _numberSequenceCode;
              numberSequenceList.transId           = 0;
              numberSequenceList.status            = NumStatus::Free;
              numberSequenceList.num               = _num;
              numberSequenceList.insert();
              ok = TRUE;
          }
      }
 
     //#N,  1001 10/01/2008- -->
      userConnection.ttscommit();
     //#N,  1001 10/01/2008- >--
      ttscommit;
 
     return  ok;
 }
Источник: http://ax-som.blogspot.com/2008/01/n...unec-lock.html
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору.
За это сообщение автора поблагодарили: Logger (1).
Старый 21.01.2008, 15:06   #2  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Робот код ошибочно стянул.
Пропустил строку

X++:
if (!numberSequenceTable)
{
см. также
Блокировка NumberSequence
Старый 21.01.2008, 15:25   #3  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от Logger Посмотреть сообщение
Робот код ошибочно стянул.
Пропустил строку
Нее. Бот безошибочный Это скорее автор ошибся и добавил эту строку позже (уже после того, как бот ее стянул)
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axStart: Microsoft Dynamics AX 2009 Hot Topics Web Seminar Series Blog bot DAX Blogs 0 06.08.2008 12:05
Arijit Basu: AX 2009 - Quick Overview Blog bot DAX Blogs 4 19.05.2008 14:47
Arijit Basu: Reporting & BI in AX: An Overview [Level 100] Blog bot DAX Blogs 0 07.01.2008 16:01
Dynamics AX: Yellow Lock in Dynamics AX 4.01 Blog bot DAX Blogs 14 07.06.2007 18:51
Arijit Basu: New Number Sequence for new AX Module Blog bot DAX Blogs 1 16.04.2007 10:39

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

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

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