Вчера у нас возникла ситуация при выгрузке в другую систему, когда пакетник выгружающий в другую систему пересекся с выгрузкой в буферную таблицу (откуда идет выгрузка в другую систему),
т.е. в другую систему выгрузился еще не полностью вставленный в буферную таблицу заказ (попали не все строки).
Чтобы побороть такие ситуации надо использовать чтение данных в тразакции
и у читаемой таблицы использовать метод Таблица.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;
}