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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.01.2014, 22:12   #21  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Цитата:
Сообщение от belugin Посмотреть сообщение
Может быть в данном конкретном случае то никогда не случится, а может быть это случится на следующей неделе - попробуй, например, запустить этот процесс с двух машин одновременно
Правильно ли я тебя понимаю, что когда, допустим в разноске надо обновить два десятка таблиц и вставить в еще пару десятков, то методологически правильно открывать ОДНУ транзакцию, вешать блокировку while select forupdate по обновляемым таблицам? Иначе тоже может произойти пук и мы потеряем целостность, то есть запишем в таблицу налогов одни цифири, а допустим документы не обновим.
__________________
Axapta book for developer
Старый 22.01.2014, 22:21   #22  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Вот ещё интересная реализация Модификация огромного количества (сотни тысяч) записей в Axapta 3.0 SP4
Старый 23.01.2014, 07:39   #23  
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:12   #24  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,129 / 916 (35) +++++++
Регистрация: 03.04.2002
Цитата:
Сообщение от MikeR Посмотреть сообщение
Правильно ли я тебя понимаю, что когда, допустим в разноске надо обновить два десятка таблиц и вставить в еще пару десятков, то методологически правильно открывать ОДНУ транзакцию
Насколько я понимаю, именно в этом смысл транзакции и есть.
__________________
Isn't it nice when things just work?
Старый 23.01.2014, 08:47   #25  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от MikeR Посмотреть сообщение
допустим в разноске надо обновить два десятка таблиц и вставить в еще пару десятков, то методологически правильно открывать ОДНУ транзакцию, вешать блокировку while select forupdate по обновляемым таблицам?
Если объемы необходимых изменений столь велики, то методологически правильно сначала вне транзакции выполнить все долгие вычисления и получить "грязные" данные, а потом в одной транзакции минимально затратным способом их применить "на чисто", естественно убедившись что с момента вычисления данные не устарели. Конечно поддержка такого рода механизмов изначально должна быть заложена в архитектуру данных. Например, хорошо когда архитектура данных позволяет вместо полного пересчета устаревших данных, учесть в новом расчете только новые изменения, произошедшие с момента предыдущего расчета.

И даже здесь возникает дилемма, что лучше заблокировать два десятка таблиц на 5 минут и гарантированно выполнить разноску? Или пересчитывать постоянно меняющиеся данные до посинения? Это уже организационный вопрос и решать его нужно организационными методами. Например, если оперативность разноски не критична, то выносить такую разноску в пакетное задание на ночь.
Старый 23.01.2014, 08:56   #26  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Примеры архитектурных решений:
Целостность данных при длительных запросах
Kurt Hatlevik: Review of inventory II
Старый 23.01.2014, 08:57   #27  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение

И даже здесь возникает дилемма, что лучше заблокировать два десятка таблиц на 5 минут и гарантированно выполнить разноску? Или пересчитывать постоянно меняющиеся данные до посинения? Это уже организационный вопрос и решать его нужно организационными методами. Например, если оперативность разноски не критична, то выносить такую разноску в пакетное задание на ночь.
Вопрос черновика и беловика даже не обсуждается, но и беловик разными процессами обновляется. Если допустим накладную разносить по ночам, то клиенты. которые приехали за товаром, загрузили в машину, а с накладной им говорят -"приходите завтра", просто разбегутся. И получается, что мы сидим и ждем, пока накладная ИП Иванова проведется, далее еще человек сто так же терпиливо ожидает.
__________________
Axapta book for developer
Старый 23.01.2014, 09:03   #28  
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, 09:40   #29  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от Vadik Посмотреть сообщение
Давайте для экономии времени будем исходить из того что разработчик по умолчанию знает что в данном случаем является минимальным скопом для транзакции
Давайте исходить из предложенного примера. MikeR,
- что произойдет, если нерадивый админ кильнет aos32 на середине процесса обновления таблицы? (случится креш аоса, пропадение связи и прочее - кстати, код на сервере выполняется?)
- что произойдет если два пользователя запустят этот процесс одновременно
- используется ли на изменяемой таблице оптимистичная или пессимистичная блокировка и как измениться поведение "совсем уж мелких деталей" при этом.

P.S. По моему опыту есть некий оптимум по скорости обновления записей и он может находиться где-то между "все записи сразу" и "каждая запись отдельно". Т.е. может быть более выгодно обновлять пакетами по n записей.
Старый 23.01.2014, 10:43   #30  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
2belugin я почему открыл обсуждение, что ОПТИМИСТИЧЕСКАЯ МОДЕЛЬ НЕ СОГЛАСУЕТСЯ С ЦЕЛОСНОСТЬЮ, даже inventTrans оптимистический. И ведомые языческами богами других систем народ продавливает производительность. Или давайте возвращаться к писиместической модели, и тогда код написанный нерадивым коллегой будет корректен. Почему нерадивым -у него посто куча разных ляпов, ключевое поле guid, допустим, об осталном уже писал. Он просто пытался подделать то, что знал из другой системы в аксапту. А здесь другая религия. Никто к пессимизму не вернется, так как по производительности будет полный провал. Хотя стоит отметить есть и другие реализации, но их мало.
__________________
Axapta book for developer
Старый 23.01.2014, 11:14   #31  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от MikeR Посмотреть сообщение
Правильно ли я тебя понимаю, что когда, допустим в разноске надо обновить два десятка таблиц и вставить в еще пару десятков, то методологически правильно открывать ОДНУ транзакцию,
Это зависит от того, какие механизмы используются. Например, каждый документ можно запихать в отдельную транзакцию - так как у него есть свой отдельный статус. В приведенном выше примере ты предлагаешь разбить проведение одного документа на отдельные транзакции - в этом случае надо вводить какую-то новую сущность для контроля разноски частей документа.

См. также давнишнюю статью Fed'а про то, как избегают блокировок в inventory
Старый 23.01.2014, 11:16   #32  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от MikeR Посмотреть сообщение
2belugin я почему открыл обсуждение, что ОПТИМИСТИЧЕСКАЯ МОДЕЛЬ НЕ СОГЛАСУЕТСЯ С ЦЕЛОСНОСТЬЮ
Расшифруй?

Цитата:
Никто к пессимизму не вернется, так как по производительности будет полный провал.
Это завсит от вероятности коллизии на конкретной таблице. (Знаешь, почему одна модель называется оптимистической, другая пессимистической)?
Старый 23.01.2014, 12:04   #33  
someOne is offline
someOne
Участник
Аватар для someOne
 
173 / 423 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Цитата:
Сообщение от MikeR Посмотреть сообщение
Для карсоты решения еще раз приведу утверждения

5 Корректный код
X++:
while select ItemId 
    from salesLine 
{ 
    select firstOnly forUpdate ItemType, ItemBuyerGroupId  
       from inventTable 
           where inventTable.ItemId == salesLine.ItemId; 
 
    If (inventTable && (inventTable.ItemType == InventItemType::Item)) 
    { 
        ttsBegin; 
        inventTable.ItemBuyerGroupId = ; 
        inventTable.update(); 
        ttsCommit; 
    } 
}
Вот до кучи еще вариант: (без всяких ttsbegin вообще)
X++:
while select ItemId 
    from salesLine
join inventTable
where inventTable.itemid == salesLine.itemId &&
inventTable.ItemType == InventItemType::Item  
{ 
        update_recordset inventTableUpd
        setting inventTableUpd.ItemBuyerGroupId = 
        where inventTableUpd.ItemId == salesLine.ItemId;
}
Кстати к вопросу о производительности БД. Множество ttsbegin --> ttscommit не всегда лучший вариант для производительности БД.

Объединение множественных обновлений в одну транзакцию - это конечно блокировки - но более производительный вариант для БД ИХМО.

Последний раз редактировалось someOne; 23.01.2014 в 12:09.
За это сообщение автора поблагодарили: mazzy (2), MikeR (3).
Старый 23.01.2014, 13:17   #34  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
someOne хороший варинат, если покурсовый не перекрыт.
__________________
Axapta book for developer
Старый 23.01.2014, 13:58   #35  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от someOne Посмотреть сообщение
Вот до кучи еще вариант
А в чем профит от использовании групповой операции применительно к одной записи?
Старый 23.01.2014, 14:08   #36  
online
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,893 / 5650 (194) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
А в чем профит от использовании групповой операции применительно к одной записи?
Один запрос к SQL Server вместо двух...
За это сообщение автора поблагодарили: S.Kuskov (1).
Старый 23.01.2014, 14:25   #37  
LeonDerCom is offline
LeonDerCom
Участник
 
45 / 20 (1) +++
Регистрация: 08.10.2012
Определение транзакции уже дает ответ на данный вопрос. И если каждое действие зависит от предыдущего - тогда делаем в одной транзакции, а если действия независимы - то какая разница? Произойдет бум в середине изменения состояния независимых записей - ну и ладно. Запустим заново и доделаем (в идеале, механизм проверки должен быть), иначе, транзакция по полной программе - зато данные в порядке.
То есть, сейчас вы спорите просто о том, кто и как для себя видит 1 единицу действия сферического коня в вакууме... Ответ на вопрос зависит только от предпочтений и опыта программиста в в каждом конкретном случае.
Старый 24.01.2014, 03:23   #38  
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   #39  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от Kabardian Посмотреть сообщение
[*]Записи блокируются на все время обновления, однако, если включена оптимистичная модель, то блокировка снимается с записей по мере их обновления
Что-то вы путаете

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

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

При пессимистической в конечном счете, скорее всего, будет заблокирована вообще вся таблица (конечно, сильно зависит от распределения данных по компаниям)
__________________
Axapta v.3.0 sp5 kr2
Старый 24.01.2014, 10:15   #40  
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, время: 11:49.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.