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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.01.2014, 17:52   #1  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
В первом письме темы можно нажать на >> в цитате
Старый 22.01.2014, 22:21   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,448 / 1792 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Вот ещё интересная реализация Модификация огромного количества (сотни тысяч) записей в Axapta 3.0 SP4
Старый 23.01.2014, 07:39   #3  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Здорово, так все равно идет разбиение на отдельные транзакции, и НИКТО НЕ ГАРАНТИРУЕТ, что между i=5 и i=6 не произойдет бум!!
Целостьность, которую ставили выше всего так же страдает!!


ЗЫ может именно поэтому двенашка так сильно тормозит по сравнению с девяткой
Однако, политкорректненько вы плюсы раздаете
__________________
Axapta book for developer

Последний раз редактировалось MikeR; 23.01.2014 в 07:42.
За это сообщение автора поблагодарили: S.Kuskov (2).
Старый 23.01.2014, 08:56   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,448 / 1792 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Примеры архитектурных решений:
Целостность данных при длительных запросах
Kurt Hatlevik: Review of inventory II
Старый 23.01.2014, 09:03   #5  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Тоже отчасти сомнительно решение, переносить логику работы на уровень сиквела. Нужно при изменении данных, редактировать код еще и в хранимках, это в лучшем случае, а так еще и в строках передаваемых запросов, так как о них знает исключительно человек написавший, и никакими перекрестниками вы информацию не соберете.
Я это к тому, что и оптимистическая модель, так же не согласуется с целостностью. Первый держащий блокировку процесс идет лесом, какая уж тут согласованость и целостность. Однако тренд ныне популярный.
__________________
Axapta book for developer

Последний раз редактировалось MikeR; 23.01.2014 в 09:06.
Старый 23.01.2014, 14:25   #6  
LeonDerCom is offline
LeonDerCom
Участник
 
45 / 20 (1) +++
Регистрация: 08.10.2012
Определение транзакции уже дает ответ на данный вопрос. И если каждое действие зависит от предыдущего - тогда делаем в одной транзакции, а если действия независимы - то какая разница? Произойдет бум в середине изменения состояния независимых записей - ну и ладно. Запустим заново и доделаем (в идеале, механизм проверки должен быть), иначе, транзакция по полной программе - зато данные в порядке.
То есть, сейчас вы спорите просто о том, кто и как для себя видит 1 единицу действия сферического коня в вакууме... Ответ на вопрос зависит только от предпочтений и опыта программиста в в каждом конкретном случае.
Старый 24.01.2014, 03:23   #7  
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   #8  
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   #9  
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.
Старый 24.01.2014, 10:17   #10  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2494 (89) +++++++++
Регистрация: 20.08.2005
Не, не понятно

Блокировка, наложенная при обновлении, держится до момента окончания транзакции
Независимо от модели блокировок Аксапты - сиквел об этом вообще ничего не знает
__________________
Axapta v.3.0 sp5 kr2
Старый 24.01.2014, 10:35   #11  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Если отпустить блокировку после обновления записи, но до коммита транзакции, то у конкурирующей транзакции может случиться "грязное чтение", например. Так что AndyD говорит все верно.
Старый 24.01.2014, 10:58   #12  
Kabardian is offline
Kabardian
Талантливый разгвоздяй
Аватар для Kabardian
 
424 / 338 (12) ++++++
Регистрация: 14.12.2008
Адрес: Москва
Записей в блоге: 14
Belugin, AndyD, может я и в самом чего-то не понимаю, процитирую статью About locking and blocking in Dynamics AX and how to prevent it (ссылку на нее давал выше):

Нажмите на изображение для увеличения
Название: 24-01-2014 10-54-54.jpg
Просмотров: 212
Размер:	198.1 Кб
ID:	8702
Старый 24.01.2014, 11:08   #13  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
График противоречит тексту над ним (выбираем без блокировки, при это после обработки 1/6 записей все они заблокированы)
Старый 24.01.2014, 11:30   #14  
Kabardian is offline
Kabardian
Талантливый разгвоздяй
Аватар для Kabardian
 
424 / 338 (12) ++++++
Регистрация: 14.12.2008
Адрес: Москва
Записей в блоге: 14
Цитата:
Сообщение от belugin Посмотреть сообщение
График противоречит тексту над ним (выбираем без блокировки, при это после обработки 1/6 записей все они заблокированы)
График не противоречит тексту. График одновременно объясняет работу оптимистичной и пессимистичной модели, поэтому надо вчитываться внимательней, чтобы понять.
Цитата:
Сообщение от AndyD Посмотреть сообщение
Ко всему прочему, там нет ни слова о снятии блокировок после апдейта
А это тогда о чем? (текст сразу под графиком)
Цитата:
When using OCC the positive effect is obvious: There are much more rows available for updating (the olive bars). When we would have PCC the olive bars would not be available for updating, or in the words another process / tranaction would be blocked until all rows are processed. So when using OCC the chances for blocking is much smaller.
Старый 24.01.2014, 11:41   #15  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от Kabardian Посмотреть сообщение
А это тогда о чем? (текст сразу под графиком)
Там не написано про блокировки после апдейта ничего. OCC работает так:

Выбирает запись, запоминая его версию, дальше апдейтит, выставляя блокировку и проверяя что версия не изменилась. Если версия изменилась, то выбрасывает особый эксепшн. Блокировка держится до конца тразакции.

Если бы этого не было, то возможен был бы следующий сценарий.

Например некая транзакйия хочет выбрать две записи и их изменить. Если она не заблокирует первую запись до конца транзакции, то при этом другая транзакия сможет увидеть ее содержимое до конца первой транзакции и пойдет дальше с учетом этих грязных данных (dirty read). Первая транзакция может быть откатана, напрммер, потому что вторую запись успела изменить третья транзакция (после чтения первой и до сохранения). И тогда у нас будут в базе данные частично как будто первая транзакция завершилась успешно (в первой записи) в частично как будно нет (во второй)
Старый 24.01.2014, 11:16   #16  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2494 (89) +++++++++
Регистрация: 20.08.2005
Угу, подписи перепутаны. Должно быть наоборот

Ко всему прочему, там нет ни слова о снятии блокировок после апдейта
__________________
Axapta v.3.0 sp5 kr2
Старый 24.01.2014, 11:24   #17  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2494 (89) +++++++++
Регистрация: 20.08.2005
Замечу так же, что при блокирующем чтении блокировки на выбираемые записи накладываются не на весь набор сразу, а по мере чтения записей.
Учитывая, что Аксапта использует серверные курсоры и данные вычитываются из таблицы порциями, картина блокировок будет не сильно отличатся от приведенной для оптимистического сценария. Только кол-во блокировок будет нарастать не пропорционально обновлению, а пропорционально чтению

Естественно, это справедливо для случая обновления всех прочитанных записей и без эскалации блокировок
__________________
Axapta v.3.0 sp5 kr2
Старый 24.01.2014, 11:49   #18  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2494 (89) +++++++++
Регистрация: 20.08.2005
Переверните все-таки подпись к оси ординат и все встанет на свои места

А в тексте предполагается единомоментное наложение блокировки при блокирующем чтении (что не соответствует действительности) - т.е. график будет в виде "кирпича", а не красивых ступенек, которые, якобы, уменьшают вероятность блокировок
__________________
Axapta v.3.0 sp5 kr2
Старый 24.01.2014, 12:18   #19  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,913 / 5736 (197) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от AndyD Посмотреть сообщение
Переверните все-таки подпись к оси ординат и все встанет на свои места

А в тексте предполагается единомоментное наложение блокировки при блокирующем чтении (что не соответствует действительности) - т.е. график будет в виде "кирпича", а не красивых ступенек, которые, якобы, уменьшают вероятность блокировок
А ты можешь привести какую-то ссылочку в подтверждение ?

Ну то есть - да - я понимаю что мы не можем заблокировать записи до того момента пока мы их не нашли и не прочитали. Но разве там система не вешает intent locks на более верхнем уровне до момента чтения ?

Кроме того - как-то мне казалось что как раз при работе с серверными курсорами, система фетчит выборку, потом засовывает во временную таблицу в tempdb и потом по ней навигирует (естественно - заблокировав все скопированные записи в исходной таблице).
Старый 24.01.2014, 12:05   #20  
Kabardian is offline
Kabardian
Талантливый разгвоздяй
Аватар для Kabardian
 
424 / 338 (12) ++++++
Регистрация: 14.12.2008
Адрес: Москва
Записей в блоге: 14
Больше не могу теоретизировать на эту тему, вечером прогоню несколько сценариев обновления данных и отпишу результат.

Belugin, AndyD, спасибо за подробные ответы.
Теги
базовая информация, транзакции

 

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