29.07.2011, 11:14 | #1 |
Участник
|
DAX2009. Пессимистическая конкуренция и метод EPStateStore::Ceanup()
После включения пессимистической конкуренции в EventLog на сервере появляются следующие сообщения (периодичность появления зависит от параметра "Период очистки" корпоративного портала. По умолчанию - 2 минуты)
Цитата:
Object Server 01: Dialog issued for client-less session 1: Cannot edit a record in @SYS126552 (EPServerStateCleanupSettings).
Cannot call NEXT, update(), or delete() on buffer where data is selected or inserted in another transaction scope. Object Server 01: Dialog issued for client-less session 1: (S)\Classes\xRecord\Update (S)\Classes\xRecord\write (S)\Data Dictionary\Tables\EPStateStore\Methods\CleanUp - line 35 Для исправления ошибки, предлагаю следующие изменения в этом методе, которые будут работать с обеими моделями конкуренции X++: public server static void cleanUp() { EPServerStateCleanupSettings table; EPServerStateCleanupSettings tableUpd; ... // selct the cleanup table for update select firstonly table; // Здесь исправлено - убран forUpdate. // Предыдущий комментарий относится к оригиналу // Check if update is due if(!table || (table.NextCleanup <= now)) { try { if(!table) new EPStateStoreTablePermission(EPStateStoreDBOperation::Insert).assert(); else new EPStateStoreTablePermission(EPStateStoreDBOperation::Edit).assert(); ttsbegin; tableUpd = null; if (table) { select forupdate firstOnly tableUpd; if (table.recVersion != tableUpd.recVersion) throw Exception::UpdateConflict; } // The next update is "now + the frequency" tableUpd.NextCleanup = DateTimeUtil::addMinutes(now, settings.CleanupFrequency); // Attempt to update the clean up table, if we succeed then we will do the clean up // this update makes sure if there are multiple AOSs only one will do the clean up. tableUpd.write(); ttscommit; } catch(Exception::UpdateConflict) { ... X++: if(settings.CleanupFrequency == 0) return; Проверялось на DAX2009 SP1 RU7
__________________
Axapta v.3.0 sp5 kr2 |
|