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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.09.2007, 11:13   #1  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Чтение только завершенных транзакций.
Вчера у нас возникла ситуация при выгрузке в другую систему, когда пакетник выгружающий в другую систему пересекся с выгрузкой в буферную таблицу (откуда идет выгрузка в другую систему),
т.е. в другую систему выгрузился еще не полностью вставленный в буферную таблицу заказ (попали не все строки).

Чтобы побороть такие ситуации надо использовать чтение данных в тразакции
и у читаемой таблицы использовать метод Таблица.readPast(true) - чтение завершенных транзакций.
Если читать не в транзакции, то будут выбираться все записи (в том числе не завершенные).
Если читать в тразакции без readPast(true), то будут блокировки.

ЗЫ.
Можно-ли установить уровень изоляции транзакции ?

ЗЗЫ
Для понимания два джоба (ВНИМАНИЕ используется ProjTable)

X++:
static void Job_00001(Args _args)
{
    ProjTable       p;
    int             i;
    ;
    delete_from p where p.ProjId like "test__*";

    ttsbegin;
    for (i = 1; i <=10; i++)
    {
        p.ProjId = strfmt("test__%1",i);
        p.doinsert();
    }
    ttscommit;
    ttsbegin;
    for (i = 11; i <=20; i++)
    {
        p.ProjId = strfmt("test__%1",i);
        p.doinsert();
    }
    pause;
    ttsabort;

    pause;
    delete_from p where p.ProjId like "test__*";
}
X++:
static void Job_00002(Args _args)
{
    ProjTable       p1, p2, p3, p4, p5;
    int             i;
    ;
    while select p1
    {
        print(strfmt("nontts %1", p1.ProjId));
        info(strfmt("nontts %1", p1.ProjId));
    }

    p2.selectLocked(false);
    while select p2
    {
        print(strfmt("nontts selectLocked(false) %1", p2.ProjId));
        info(strfmt("nontts selectLocked(false) %1", p2.ProjId));
    }

    ttsbegin;

    p3.readPast(true);
    while select p3
    {
        print(strfmt("tts readPast(true) %1", p3.ProjId));
        info(strfmt("tts readPast(true) %1", p3.ProjId));
    }

    p4.selectLocked(false);
    while select p4
    {
        print(strfmt("tts selectLocked(false) %1", p4.ProjId));
        info(strfmt("tts selectLocked(false) %1", p4.ProjId));
    }

    while select p5
    {
        print(strfmt("tts %1", p5.ProjId));
        info(strfmt("tts %1", p5.ProjId));
    }

    ttscommit;
}
За это сообщение автора поблагодарили: axaLearner (1), iCloud (2).
Старый 14.09.2007, 12:01   #2  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
А вопрос-то в чем? Что в результате надо получить?

1) Читать все, кроме строк из не завершенной транзакции? Тогда в какой момент будет обработаны записи добавленные этой транзакции?

2) Отложить обработку до завершения транзакции?
Старый 14.09.2007, 12:35   #3  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
А вопрос-то в чем? Что в результате надо получить?

1) Читать все, кроме строк из не завершенной транзакции? Тогда в какой момент будет обработаны записи добавленные этой транзакции?

2) Отложить обработку до завершения транзакции?
Вопроса нет, есть предостережение, что бы на такие же грабли не наступали.

1 и 2 в нашем случае не полностью выгруженный заказ выгрузиться потом, т.к. он выгружается в одной транзакции.
Старый 14.09.2007, 20:03   #4  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
raz, спасибо за интересную тему для размышлений.

Вам стоило указать, что вы писали про 3.0 под MS SQL (я слыхал, что в Oracle считать в другой сессии незакомиченные данные невозможно).

Чтобы подобного рода ситуации для вас не были неожиданностью, рекомендую вам для прочтения параграф "Transaction Semantics" из книжки Inside Microsoft Dynamics™ AX 4.0. Он находится в 12-й главе третьей части.

Там также очень интересное приложение В (касаемо 4.0 и различных СУБД).

http://safari.oreilly.com/9780735622579/app02#app02

Надеюсь, что это постоянная ссылка.

Получается, что если в 3.0 на MS SQL Аксапта норовила почти везде прикрутить к запросу NOLOCK (в запросах из форм, отчетов, в запросе из кода не внутри транзакции), то в 4.0 запросы идут с READ COMMITTED (даже из форм, отчетов, обозревателя таблицы). Так, в 3.0 можно было открыть форму, и увидеть в ней строчку, которая еще не закомичена. В 4.0 в такой ситуации клиент подвисает до тех пор, пока транзакция не закроется или не откатится.

Другими словами желаемый вами эффект READ COMMITTED достигается без транзакции. Хотя если вы хотите еще и от блокировок избавиться, то ваше решение остается в силе (мне удалось заставить работать .readPast(true) только внутри транзакции).

А вот у меня возник такой вопрос. Каким образом из Аксапты 4.0 можно отправить запрос на MS SQL 2005, чтобы в нем таки был хинт NOLOCK? И как отправить запрос, чтобы он отработал при уровне изоляции транзакции SNAPSHOT, если таковой режим включен для БД? Я пытался на ощупь, но не смог пока добиться такого эффекта. Поиск также не помог мне найти ответ на вопрос. Может быть кто-то сможет подсказать?
__________________
С уважением,
glibs®
За это сообщение автора поблагодарили: Logger (3), iCloud (2).
Старый 19.05.2017, 10:20   #5  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Похоже именно из-за таких особенностей во многих местах у документов сперва создаются строки и в самом конце вставляется шапка. В таком случае описанных проблем не возникает.
Теги
программно, транзакции

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Неверный откат сопоставленных транзакций sgt.Pepper DAX: Программирование 4 17.01.2008 09:16
Чтение данных за пределами файла, временная таблица zemlyn DAX: Программирование 0 05.12.2005 18:32
IMTS (Система множественных складских транзакций) yuranio DAX: Функционал 7 04.03.2005 17:56
Хочу видеть только итоги AKIS DAX: Функционал 1 19.08.2002 11:49

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

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

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