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