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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.07.2012, 17:20   #1  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Ответ: По поводу while select forUpdate
Ответ на сообщение Коллеги, что вы думаете о данном коде?
Цитата:
Сообщение от MikeR Посмотреть сообщение
Вторая ссылка тоже ни о чем не говорит?
Значит вы не поняли или не смог я вам объяснить.
Если бы вы внимательно прочитали ссылку, которую привели, то увидели бы, что там есть анонс описания механизма OCC, который описан буквально в следующей статье Излучая оптимизм и доступен уже начина с KR2 для трешки (а для четверки и следующих версий доступен уже с начальной версии).
Так вот, с включенным оптимистическим OCC никакой блокировки при вызове [while] select forUpdate уже не происходит (вот насчет того, что блокировка отключается и в трешке не уверен).

Да и приведенный в статье код - это попытка задействовать этот самый механизм при отсутствии его поддержки ядром
Правда, с моей точки зрения, в данном конкретном случае никаких преимуществ это не дает.
  • судя по изначальному алгоритму, должны быть изменены все записи, попадающие в выборку. А это автоматически влечет за собой блокировку, независимо от включенного режима конкуренции
  • время, которое удерживаются блокировки, в варианте исправления только увеличится, что приведет к увеличению вероятности возникновения взаимоблокировок
  • фраза "while select forupdate, который можеn привести к блокировке таблицы" актуальна только при большом количестве записей в выборке (>5000), причем, эскалация произойдет не сразу. Да и для отдельной выборки эскалация все равно может произойти в случае превышения выделенной под блокировки памяти (для всех соединений, а не только текущего)
  • сам вариант исправления не совсем корректен к изначальному алгоритму (и к механизму OCC) - в изначальной выборке может быть больше записей, чем было затем обработано

И, если уж идет речь об исключении эскалации, то более эффективно будет управлять этим на уровне настроек SQL-сервера, а не прикладного кода.

Хотя, есть маленький финт, который позволит блокировать эскалации из алгоритма, в случае если надо обработать много записей.
Достаточно перед выполнением while select forUpdate сделать запрос с блокировкой к несуществующей записи в отдельном коннекте в своем контексте транзакции, которая будет удерживаться все время выполнения операции
X++:
MyTable myTableLock;
MyTable myTable;
UserConnection uc = new UserConnection();
;

myTableLock.setConnection(uc);
myTableLock.concurrencyModel(ConcurrencyModel::Pessimistic); // Это нужно для 2009-й (и четверки, по всей видимости) для гарантированного срабатывания
uc.ttsbegin();

select forUpdate myTableLock
where myTableLock.RecId == 0;

//Дальше можно выполнять обработку большего количества записей таблицы
ttsbegin;
myTable.concurrencyModel(ConcurrencyModel::Pessimistic); // Это нужно для 2009-й (и четверки, по всей видимости) для гарантированного срабатывания
while select forUpdate myTable
{
    myTable.update();
}
ttscommit;

uc.ttsabort();
На время удержания транзакции в доп. соединении эскалация будет исключена полностью для таблицы для любого соединения, в том числе и по причине исчерпания памяти, так что надо использовать с осторожностью, если возникнет необходимость

С включенной оптимистической конкуренцией этот хинт, естественно, не нужен
__________________
Axapta v.3.0 sp5 kr2

Последний раз редактировалось AndyD; 19.07.2012 в 17:24.
За это сообщение автора поблагодарили: sukhanchik (2), GBH (1).
Старый 19.07.2012, 18:23   #2  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Цитата:
Сообщение от AndyD Посмотреть сообщение
Ответ на сообщение Коллеги, что вы думаете о данном коде?

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


ЗЫ не надо подозревать в чем не уверены.
Прошу не устраивать холивар на тему чьи яйца круче.
__________________
Axapta book for developer

Последний раз редактировалось MikeR; 19.07.2012 в 18:25.
Старый 19.07.2012, 18:32   #3  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от MikeR Посмотреть сообщение
Во-первых, спасибо за расширенный ответ, а во вторых у нас то как раз OCC и выключен и записей в таблице приближается пока к 1000. И поэтому я об этом и писал, жаль что вы не уточнили и сразу выводы делаете.


ЗЫ не надо подозревать в чем не уверены.
Прошу не устраивать холивар на тему чьи яйца круче.
:рукалицо:
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: MikeR (2).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
dynamicsaxtraining: Select statement patterns Blog bot DAX Blogs 10 20.08.2010 14:01
kamalblogs: Using while select firstonly to avoid validations in Dynamics Ax Blog bot DAX Blogs 6 03.08.2010 23:38
Разница NotInTTS и Found Logger DAX: База знаний и проекты 6 18.09.2008 12:35
Вопрос про Demand Planner slava09 DAX: Функционал 4 25.09.2006 11:43
select FORUPDATE renat DAX: Программирование 5 10.09.2003 09:45

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

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

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