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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.11.2014, 07:05   #1  
Perc is offline
Perc
Участник
 
194 / 57 (2) ++++
Регистрация: 05.03.2005
ttsbegin и зацикливание While select
Ранее еще с тройки время от времени использовал такую конструкцию например:
X++:
ttsbegin;
while select ledgerJournalTrans {
  i++;
  ...
  if (i mod 100 == 0) {
    ttscommit;
    ttsbegin;
  }
}
ttscommit;
и как то не помню чтобы сталкивался с проблемой. А тут вдруг столкнулся с зацикливанием. Гдето после 110-120 записи ledgerJournalTrans начинает выборку с начала. Причем в моем данном, случае внутри цикла ledgerJournalTrans вообще никак не менялся. Был в недоумении. Пришлось задуматься. Переписал на:
X++:
while select ledgerJournalTrans {
  i++;
  if (first) {
    ttsbegin;
    first = false;
  }
  ...
  if (i mod 100 == 0) {
    ttscommit;
    ttsbegin;
  }
}
if (!first)
  ttscommit;
Все заработало нормально. В чем вопрос?
Да так.. просто хотелось узнать от спецов по работе с СУБД физику процесса)
Старый 20.11.2014, 11:26   #2  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
просто хотелось узнать от спецов по работе с СУБД физику процесса
AX использует динамические курсоры. Если в процессе обработки меняется физическое местоположение записи (например, обновляется поле входящее в состав кластерного индекса или происходит расщепление страниц) запись может "дофетчиться" курсором повторно. Лечится разными способами - например, принудительной сортировкой по полям для которых гарантируется неизменность (например RecId)
__________________
-ТСЯ или -ТЬСЯ ?
За это сообщение автора поблагодарили: S.Kuskov (5).
Старый 21.11.2014, 07:39   #3  
Perc is offline
Perc
Участник
 
194 / 57 (2) ++++
Регистрация: 05.03.2005
Цитата:
Сообщение от Vadik Посмотреть сообщение
AX использует динамические курсоры. Если в процессе обработки меняется физическое местоположение записи (например, обновляется поле входящее в состав кластерного индекса или происходит расщепление страниц) запись может "дофетчиться" курсором повторно. Лечится разными способами - например, принудительной сортировкой по полям для которых гарантируется неизменность (например RecId)
Ну вот мои наблюдения с данным джобом противоречат этому тезису. Джоб конечно задумывался для обновления кое-каких записей. Но в моем случае оказалось что вообще не одна запись не обновлялась - ни этим джобом, ни кем либо вообще в этот момент в базе. Но тем не менее зацикливание произошло.
Более того наблюдал обратную ситуации в подобном цикле. Записи удалялись внутри цикла удовлетворяющие условию селекта. Но цикл все равно перебирал непонятно откуда взятые уже удаленные записи.
Старый 21.11.2014, 08:35   #4  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от Perc Посмотреть сообщение
Более того наблюдал обратную ситуации в подобном цикле. Записи удалялись внутри цикла удовлетворяющие условию селекта. Но цикл все равно перебирал непонятно откуда взятые уже удаленные записи.
Аксапта закачивает данные порциями - по всей видимости, то что было удалено уже было прочитано и находилось в кэше
__________________
Axapta v.3.0 sp5 kr2
Старый 21.11.2014, 08:55   #5  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от AndyD Посмотреть сообщение
Аксапта закачивает данные порциями - по всей видимости, то что было удалено уже было прочитано и находилось в кэше
На сколько я понял, удаление производилось непосредственно в той же сессии что и чтение. Т.е. по логике удаление не должно было бы пройти мимо кэша. Кстати, а о каком кэше речь? В общем, непонятна...
Ещё обсуждение похожего вопроса Как должен работать такой запрос

Создается впечатление, что эти динамические курсоры имеют квантовую природу. Прямо-таки корпускулярно-волновой дуализм, какой-то. В одних случаях они фиксируют выборку перед её обходом, а в каких-то меняют её по ходу выполнения. Но сдается мне, что эта неопределенность в СУБД сидит, а не в аксапте.

Последний раз редактировалось S.Kuskov; 21.11.2014 в 09:37.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: AX Content: Select invoices to pay Blog bot DAX Blogs 0 23.10.2013 02:11
atinkerersnotebook: Using Service Management to Track Service Orders Blog bot DAX Blogs 1 25.08.2013 19:16
dynamicsaxtraining: Select statement patterns Blog bot DAX Blogs 10 20.08.2010 14:01
Разница NotInTTS и Found Logger DAX: База знаний и проекты 6 18.09.2008 12:35
Вопрос про Demand Planner slava09 DAX: Функционал 4 25.09.2006 11:43
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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