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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.07.2011, 11:14   #1  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
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;
но она сделана некорректно, так как в таблице поле CleanupFrequency объявлено как Mandatory, а метод EPStateStoreSettings::getSettings(), в случае отстствия записи, возвращает значение по умолчанию - 2 минуты

Проверялось на DAX2009 SP1 RU7
__________________
Axapta v.3.0 sp5 kr2
Теги
ax2009

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
DAX 2009,5.0.1000.52 SP1 в таблице smmBusRelTable отсутствует метод convert2Customer Murlin DAX: Программирование 8 11.11.2009 16:23
Вопросы по OLAP в DAX2009 oleg_e DAX: Функционал 9 10.12.2008 02:02
Дисплей метод таблицы который вызывается из ГРИДА 3oppo DAX: Программирование 10 23.05.2006 06:47
display метод с параметром Андре DAX: Программирование 5 11.01.2006 19:04
Передача массива VARIANTов в Automation метод Maximin DAX: Программирование 0 09.10.2002 19:31

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

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

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