19.07.2012, 17:20 | #1 |
Участник
|
Ответ: По поводу while select forUpdate
Ответ на сообщение Коллеги, что вы думаете о данном коде?
Цитата:
Так вот, с включенным оптимистическим OCC никакой блокировки при вызове [while] select forUpdate уже не происходит (вот насчет того, что блокировка отключается и в трешке не уверен). Да и приведенный в статье код - это попытка задействовать этот самый механизм при отсутствии его поддержки ядром Правда, с моей точки зрения, в данном конкретном случае никаких преимуществ это не дает.
И, если уж идет речь об исключении эскалации, то более эффективно будет управлять этим на уровне настроек 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). |