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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.05.2008, 15:47   #1  
tourist is offline
tourist
Участник
 
21 / 14 (1) ++
Регистрация: 03.05.2006
Перед транзакцией делайте trans.reread() и еще раз проверяйте условие селекта
т.е
trans.reread();
if(trans.open)
{
ttsbegin;
...
Старый 08.05.2008, 16:02   #2  
Volodymyr is offline
Volodymyr
Участник
 
36 / 21 (1) +++
Регистрация: 03.11.2006
Адрес: Киев
Это не решит проблемы.
Ведь всеравно два батча будут работать хуже чем один...

В реальности перед апдейтом транзакции идет достаточно большая по времени функциональность, и при апдейти транзакции если возникает конфликт, то откатывается все назад.

Наверное два всегда хуже чем один...
Интересно, можно ли как то в селекте выбрать линии, которые точно не проапдейтятся другим батчем?
Старый 08.05.2008, 16:20   #3  
tourist is offline
tourist
Участник
 
21 / 14 (1) ++
Регистрация: 03.05.2006
выбор по четным и нечетным recId
Старый 08.05.2008, 16:47   #4  
Volodymyr is offline
Volodymyr
Участник
 
36 / 21 (1) +++
Регистрация: 03.11.2006
Адрес: Киев
=) Смешно... но всетаки

Вобщем задача свелась к тому, что нужно в цикле проверить можнло ли залочить текущую линию , если да, то залочиеть ее , иначе продолжить цикл (т.е. перейти к следующей линии)

Как это реализовать пока незнаю
Старый 08.05.2008, 19:36   #5  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
:)
Цитата:
Сообщение от Volodymyr Посмотреть сообщение
Интересно, можно ли как то в селекте выбрать линии, которые точно не проапдейтятся другим батчем?
Вторым батчем пойти задом наперед.
X++:
run()
{
    Trans   trans;
    Trans   buffer;
    boolean reversed;
    ;
    
    try
    {
        select trans
            order by RecId asc
            where trans.open;

        while (trans)
        {
            buffer = Trans::find(trans.recid);
            
            if (!buffer.open)
            {
                if (!reversed)
                {
                    reversed = true;
                    
                    select trans
                        order by RecId desc
                        where trans.open;
                        
                    continue;
                }
                else
                {
                    break;
                }
            }
                
            ttsbegin;
            buffer.selectForUpdate(true);
            buffer.open = false;
            buffer.doUpdate();
            .......
            buffer.update()
            ttscommit;
            
            next trans;
        }
    }
    
    catch (Exception::Deadlock)
    {
        retry;
    }
    
    catch (Exception::UpdateConflict)
    {
        retry;
    }
}
Третий батч просто вылетит.
Старый 08.05.2008, 20:49   #6  
Volodymyr is offline
Volodymyr
Участник
 
36 / 21 (1) +++
Регистрация: 03.11.2006
Адрес: Киев
TO Stich_MS: К сожалению когда один батч выполняет
PHP код:
select pessimisticLock firstonly trans
    where trans
.open == true

То второй батч при выборе этой же линии, ждет пока снимется лок сделаный первым батчем. Т.е. получается вообще плохо.
To Hyper: вот это подход я понимаю , но всетаки запуск больше двух батчей не приведет к ускорению работы.

Пришлось сделать так:
1) Добавить на таблицу поле Blocked
2) Переделать метод так:
PHP код:
run()
{
    
Trans trans;
    
Trans buffer;
    
boolean setBlocked(boolean _blocked)
    {
        if (
_blocked && trans.blocked)
            return 
false;
 
        
ttsbegin;
        
buffer Trans::find(trans.recIdtrue);
        
buffer.blocked true;
        
buffer.update();
        
ttscommit;
        return 
buffer.blocked;
    }
    try
    {
        while 
select trans where trans.open == true && trans.blocked == false
        
{
            if(
setBlocked(true))
            {
                
ttsbegin;
                
buffer Trans::find(trans.recidtrue);
                ...
                
buffer.open false;
                
buffer.update();
                
ttscommit;
                
setBlocked(false);
            }
        }
    }
    catch (
Exception::Error)
    {
        
setBlocked(false);
    }
    catch (
Exception::UpdateConflict)
    {
        
retry;
    }


Всех с Праздником!
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Невозможно выполнить команду языка определения данных в () iHomer13 DAX: Программирование 8 18.07.2008 10:56
Стандартный импорт данных. Обновление sparur DAX: Функционал 0 24.03.2008 19:07
Распределенная база данных на основе View Владимир Максимов DAX: Программирование 27 04.09.2007 13:21
Введение в Аксапту Роман Кошелев DAX: Прочие вопросы 0 18.12.2001 14:00
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

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

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