Показать сообщение отдельно
Старый 14.09.2007, 11:13   #1  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,490 / 1060 (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).