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). |
14.09.2007, 12:01 | #2 |
Участник
|
А вопрос-то в чем? Что в результате надо получить?
1) Читать все, кроме строк из не завершенной транзакции? Тогда в какой момент будет обработаны записи добавленные этой транзакции? 2) Отложить обработку до завершения транзакции? |
|
14.09.2007, 12:35 | #3 |
NavAx
|
Цитата:
1 и 2 в нашем случае не полностью выгруженный заказ выгрузиться потом, т.к. он выгружается в одной транзакции. |
|
14.09.2007, 20:03 | #4 |
Member
|
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 |
Участник
|
Похоже именно из-за таких особенностей во многих местах у документов сперва создаются строки и в самом конце вставляется шапка. В таком случае описанных проблем не возникает.
|
|
Теги |
программно, транзакции |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|