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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.01.2014, 03:23   #20  
Kabardian is offline
Kabardian
Талантливый разгвоздяй
Аватар для Kabardian
 
424 / 338 (12) ++++++
Регистрация: 14.12.2008
Адрес: Москва
Записей в блоге: 14
ИМХО:
  1. Согласен с Belugin про целостность данных, суть транзакции никто не отменял!
  2. Best practice, которые привел MikeR не говорят о том, что надо вообще любые обновления данных делать вложенными в while select forupdate транзакциями. Они говорят как можно уменьшить количество обращений к базе данных и извлечь пользу от оптимистической модели. Это надо применять предельно осторожно и осознанно.
  3. Чтобы было совсем по best practice в пример MikeR необходимо в запрос добавить optimisticlock, чтобы оптимистичная модель применялась независимо от настроек таблицы в которой выполняется обновление данных:
    X++:
    while select optimisticlock ...
  4. Касательно примера, который привел MikeR, я его не буду комментировать, но поясню на примерах из книги Inside Dynamics AX 2012 (см. стр. 444-446), где рассматривается пример обновления кредитного лимита для всех клиентов:

    ПРИМЕР №1:
    X++:
    static void UpdateCreditMax(Args _args) 
    { 
        CustTable custTable; 
        
        ttsBegin; 
        while select forupdate custTable where custTable.CreditMax == 0 
        { 
            if (custTable.balanceMST() < 10000) 
            { 
                custTable.CreditMax = 50000; 
                custTable.update(); 
            } 
        } 
        ttsCommit; 
    }
    Особенности:
    • В случае сбоя либо все данные обновятся, либо нет.
    • Записи блокируются на все время обновления, однако, если включена оптимистичная модель, то блокировка снимается с записей по мере их обновления
    • На уровне базы данных SQL будут выполнены операции: 1 select + 100 update

    ПРИМЕР №2:
    X++:
    static void UpdateCreditMax(Args _args) 
    { 
        CustTable custTable; 
        CustTable updateableCustTable; 
        
        while select custTable where custTable.CreditMax == 0 
        { 
            if (custTable.balanceMST() < 10000) 
            { 
                ttsBegin; 
                select forupdate updateableCustTable 
                where updateableCustTable.AccountNum == custTable.AccountNum; 
                updateableCustTable.CreditMax = 50000; 
                updateableCustTable.update(); 
                ttsCommit; 
            } 
        } 
    }
    Особенности:
    • В случае сбоя часть данных будет обновлена, а часть - нет
    • Блокируется только 1 запись, которая обновляется в данный момент
    • На уровне базы данных SQL будут выполнены операции: 1 select + 100 select + 100 update

    ПРИМЕР №3:
    X++:
    static void UpdateCreditMax3(Args _args) 
    { 
        CustTable custTable; 
        
        while select optimisticlock custTable where custTable.CreditMax == 0 
        { 
            if (custTable.balanceMST() < 10000) 
            { 
                ttsBegin; 
                custTable.CreditMax = 50000; 
                custTable.update(); 
                ttsCommit; 
            } 
        } 
    }
    Особенности:
    • В случае сбоя часть данных будет обновлена, а часть - нет
    • Блокируется только 1 запись, которая обновляется в данный момент
    • На уровне базы данных SQL будут выполнены операции: 1 select + 100 update

    ИТОГО:
    • Вариант № 2 не следует использовать совсем
    • Среди вариантов №1 и №2 выбирать необходимо в зависимости от конкретно поставленной задачи таким образом, чтобы в случае сбоя системы целостность данных не пострадала и для пользователя все было прозрачно и понятно - либо пан, либо пропал.
И еще, хорошая статья со сравнением пессимистичной и оптимистично модели обновления данных:
About locking and blocking in Dynamics AX and how to prevent it
Теги
базовая информация, транзакции

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Коллеги, что вы думаете о данном коде? MikeR DAX: Программирование 36 21.01.2014 19:38
Странное поведение при закрытии склада-ошибка в коде? Aquarius DAX: Программирование 11 27.06.2013 13:37
.NET business connector не видит изменений в коде Аксапты rkorchagin DAX: Программирование 2 22.01.2010 11:43
Нужно сделать выборку из нескольких таблиц (в данном случае из четырех). niktata DAX: Программирование 10 30.09.2008 09:42
Можно ли в коде управлять свойством Mandatory? kostas DAX: Программирование 5 10.03.2004 11:14

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

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

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