AXForum  
Zurück   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 19.07.2012, 17:20   #1  
AndyD ist offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2.560 / 2494 (89) +++++++++
Registriert seit: 20.08.2005
Ответ: По поводу while select forUpdate
Ответ на сообщение Коллеги, что вы думаете о данном коде?
Zitat:
Zitat von MikeR Beitrag anzeigen
Вторая ссылка тоже ни о чем не говорит?
Значит вы не поняли или не смог я вам объяснить.
Если бы вы внимательно прочитали ссылку, которую привели, то увидели бы, что там есть анонс описания механизма 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

Geändert von AndyD (19.07.2012 um 17:24 Uhr)
This post has been rated by: sukhanchik (2), GBH (1).
Alt 19.07.2012, 18:23   #2  
MikeR ist offline
MikeR
MCT
Benutzerbild von MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1.628 / 627 (24) +++++++
Registriert seit: 28.11.2005
Ort: просто землянин
Zitat:
Zitat von AndyD Beitrag anzeigen
Ответ на сообщение Коллеги, что вы думаете о данном коде?

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


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

Geändert von MikeR (19.07.2012 um 18:25 Uhr)
Alt 19.07.2012, 18:32   #3  
AndyD ist offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2.560 / 2494 (89) +++++++++
Registriert seit: 20.08.2005
Zitat:
Zitat von MikeR Beitrag anzeigen
Во-первых, спасибо за расширенный ответ, а во вторых у нас то как раз OCC и выключен и записей в таблице приближается пока к 1000. И поэтому я об этом и писал, жаль что вы не уточнили и сразу выводы делаете.


ЗЫ не надо подозревать в чем не уверены.
Прошу не устраивать холивар на тему чьи яйца круче.
:рукалицо:
__________________
Axapta v.3.0 sp5 kr2
This post has been rated by: MikeR (2).
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
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

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 23:09 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.