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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.07.2013, 14:16   #1  
bodeaux is offline
bodeaux
Участник
Аватар для bodeaux
 
35 / 10 (1) +
Регистрация: 08.10.2012
Адрес: Екатеринбург
эксперимент
Здравствуйте.

Решил возобновить тему, чтобы еще раз попытаться разобраться с FieldUpdate = Relative

С помощью таких действий

X++:
static void Job_1(Args _args)
{
    Ltable t_1;    Ltable t_2;    Ltable t_3;;   
    // point_0
    ttsbegin;
    {// block_1
        select forupdate t_1 where t_1.id == 5;
        {// block_2
            select forupdate t_2 where t_2.id == 5;
            { // block_3
                select forupdate t_3 where t_3.id == 5;
                t_3.Val = 14;  t_3.update();
            }
            t_2.Val = 700;  t_2.update();
        }
        t_1.Val = 50000;  t_1.update();
    }
    ttscommit;
}
удалось установить, что в подобных случаях в таблице остается значение

Код:
W = V + (-V + U_1) + (-V + U_2) + ... + (-V + U_n),
где V - значение в точке point_0, U_i - значение, переданное в update номер i.

В частности, в самых интересных для практики случаях, которые обсуждались выше, получаем
1. i = 1 : W = U_1 (отличия от FieldUpdate = Absolute не видны).
2. i = 2 :
после первого запуска джоба имеем W = U_1 + U_2 - V
после второго запуска джоба имеем W = V
(любители арифметики могут убедиться, что при других i подобных циклов нет).
----------------------
Надеюсь, кто-нибудь сможет пояснить, для чего заложена именно такая формула для Relative update,
поскольку из предыдущего обсуждения мне показалось,
что люди ожидали работы по формуле W = V + U_1 + U_2 + ... + U_n.


В качестве офтопа еще хочу спросить, почему не возникает deadlock при выполнении block_2 после block_1.
__________________
Axapta 3.0 SP 4

Последний раз редактировалось bodeaux; 03.07.2013 в 14:53.
Старый 03.07.2013, 15:22   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5813 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от bodeaux Посмотреть сообщение
удалось установить, что в подобных случаях в таблице остается значение W = V + (-V + U_1) + (-V + U_2) + ... + (-V + U_n), где V - значение в точке point_0, U_i - значение, переданное в update номер i.
Надеюсь, кто-нибудь сможет пояснить, для чего заложена именно такая формула для Relative update, поскольку из предыдущего обсуждения мне показалось, что люди ожидали работы по формуле W = V + U_1 + U_2 + ... + U_n.
Relative Update предполагает именно относительное изменение значения поля. Т.е. эта возможность работает "логично", когда вам не важно прежнее значение, а важно лишь приращение. Если бы у вас был такой код (обратите внимание на инкремент вместо присваивания):
X++:
select forupdate t_1 where t_1.id == 5;
{// block_2
    select forupdate t_2 where t_2.id == 5;
    { // block_3
        select forupdate t_3 where t_3.id == 5;
        t_3.Val += 14; t_3.update();
    }
    t_2.Val += 700; t_2.update();
}
t_1.Val += 50000; t_1.update();
То все отработало бы так, как ожидается, правда?
Цитата:
Сообщение от bodeaux Посмотреть сообщение
В качестве офтопа еще хочу спросить, почему не возникает deadlock при выполнении block_2 после block_1.
Блокировки нужны для синхронизации параллельного доступа к одним и тем же записям, а тут все все выборки forupdate происходят в рамках одного соединения с БД, поэтому deadlock не возникает: в рамках одного соединения синхронизировать по определению нечего. Более интересный вопрос: почему при обновлении в случае оптимистичной конкурентной модели не возникает конфликт обновления после block_3. Ответ на этот вопрос можно найти в книге Inside Dynamics AX 2009:
Цитата:
...К счастью, среда времени выполнения Microsoft Dynamics AX управляет данной ситуацией. При исполнении оператора обновления среда времени выполнения находит все другие буфера записей, содержащие ту же запись, и если при этом они были извлечены с ключевым словом forupdate, то среда времени выполнения изменяет значение поля RecVersion данных буферов записей на новое значение из базы данных. Следовательно, второе обновление не вызовет ошибки.
То, что при обновлении с использованием одного из табличных буферов RecVersion обновляется во всех остальных табличных буферах в данном примере, можно убедиться под отладчиком.
За это сообщение автора поблагодарили: S.Kuskov (5).
Старый 03.07.2013, 17:09   #3  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2494 (89) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от gl00mie Посмотреть сообщение
То, что при обновлении с использованием одного из табличных буферов RecVersion обновляется во всех остальных табличных буферах в данном примере, можно убедиться под отладчиком.
Если верить подписи, то у bodeaux Ax3 SP4 без каких-либо KR.
Так что, убедиться будет проблематично
__________________
Axapta v.3.0 sp5 kr2
Теги
ledgerbalance, ledgerbalancesdimtrans, ledgerbalancestrans, главная книга, итоги, сальдо, crm2011

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
fed: History of inventory locking in DAX Blog bot DAX Blogs 0 28.09.2009 16:05
Microsoft DAX Dev Center Headlines: New Ledger Posting White Paper Released Blog bot DAX Blogs 0 23.11.2008 12:05
axStart: Change data on a data source on a Form Blog bot DAX Blogs 0 04.09.2008 15:05
Microsoft Dynamics CRM Team Blog: Data Migration Manager Tips and Tricks Blog bot Dynamics CRM: Blogs 0 02.09.2008 22:05
Пустые названия системных таблиц в report data range (DAX 4.0) Qaz Qwerty DAX: Функционал 3 06.08.2008 00:05
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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