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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.01.2014, 03:23   #1  
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
Старый 24.01.2014, 07:50   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2494 (89) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от Kabardian Посмотреть сообщение
[*]Записи блокируются на все время обновления, однако, если включена оптимистичная модель, то блокировка снимается с записей по мере их обновления
Что-то вы путаете

По мере обновления блокировки будут наоборот, накладываться.

Это если будет использоваться оптимистическая модель блокировок

При пессимистической в конечном счете, скорее всего, будет заблокирована вообще вся таблица (конечно, сильно зависит от распределения данных по компаниям)
__________________
Axapta v.3.0 sp5 kr2
Старый 24.01.2014, 10:15   #3  
Kabardian is offline
Kabardian
Талантливый разгвоздяй
Аватар для Kabardian
 
424 / 338 (12) ++++++
Регистрация: 14.12.2008
Адрес: Москва
Записей в блоге: 14
Цитата:
Сообщение от AndyD Посмотреть сообщение
Что-то вы путаете

По мере обновления блокировки будут наоборот, накладываться.
Может выразился некорректно, поясню. Например, есть 3 записи, которые обновляются в запросе:
  • Запись1
  • Запись2
  • Запись3

В таком случае, все записи сначала блокируются, затем система обновляет их все по порядку и в процессе обновления снимает блокировки следующим образом (оптимистичная модель):
  • Обновлена Запись 1 - блокировка с снята с Записи 1
  • Обновлена Запись 2 - блокировка с снята с Записи 2
  • Обновлена Запись 3 - блокировка с снята с Записи 3
Поэтому, убежден, что я ничего не путаю.

Последний раз редактировалось Kabardian; 24.01.2014 в 10:23.
Теги
базовая информация, транзакции

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Коллеги, что вы думаете о данном коде? 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, время: 08:15.