В доке по 3-ей Аксапте написано следующее (про работу с MS SQL Server-ом, не для Оракла)
Цитата:
Axapta uses dynamic cursors when querying against the database in order to avoid time-consuming temporary snapshots. This can lead to “runaway queries” if the query is used loop through the result set and insert / update other rows, which is qualified to be included in the result set.
Продемострировать на примере это можно легко (на Ax3sp3kr3):
Создать таблицу ZVVTestTab с единственным int-полем Field и (что немаловажно) с индексом по этому полю:
X++:
static void ZVVTestJob(Args _args)
{
ZVVTestTab testTab;
int i;
int cnt = 1000;
;
ttsBegin;
delete_from testTab;
for (i=1; i<cnt; i++)
{
testTab.Field = i;
testTab.insert();
}
ttsCommit;
ttsBegin;
while select forUpdate testTab
order by Field
{
switch (testTab.Field)
{
case 1:
testTab.Field = cnt;
testTab.update();
break;
case cnt:
info(strFmt("%1!", cnt));
break;
}
}
ttsCommit;
}
В итоге получим сообщение "
1000!", т.е. одну и ту же строку можно гонять внутри этого курсора много раз.

При чём, если индекса нет (т.е. идёт сортировка после полного просмотра таблицы, а не по индексу), то этого эффекта не возникает. Насколько я понимаю, потому что сервер сначала сортирует весь выбранный резалтСет в памяти, и идёт уже по нему, а не сканирует последовательно индекс...
Сразу оговорюсь, что update внутри цикла через другую табличную переменную ничем не помогает...
На DAX 2009 + SQL 2005 такая ситуация не повторяется, подозреваю что из-за уровня изоляции read commited snapshot. (хотя доказать обратного не могу, не пробовал, не вижу большого смысла

)
Насколько я понимаю, в 3-ке с 2000-м сиквелом избавится от подобного эффекта никак не удасться? Или может кто-то пробовал?
Я не имею ввиду "танцы с бубнами" с какими-нибудь мэпами и т.п., а по-человечески.