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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.08.2016, 14:15   #1  
MazZzDaI is offline
MazZzDaI
Участник
Аватар для MazZzDaI
 
44 / 35 (2) +++
Регистрация: 19.09.2013
AIF действия в транзакции. Откат Rollback
Привет!
При интеграции AX и стороннего приложения (СП) появилась необходимость использования транзакции на несколько последовательных действий, например:
1. СП вызывает сервис создания данных в АХ; АХ создаёт данные и возвращает ответ СП; СП сохраняет у себя результат;
2. СП вызывает сервис разноски ранее созданных данных в АХ; АХ выполняет действие и возвращает результат об успешной разноске; СП фиксирует у себя успех.
Схема простая, но добавив вероятность падения канала связи, СП не получит ответ 2 и откатит (rollback) свою транзакцию, включая результат 1.
Предполагаю необходимость костылизации механизма, например, удаление данных разноски АХ при возобновлении связи, согласование данных, стек данных, время жизни документа; но такое решение не масштабируемое и громоздкое.
Предварительный вызов АХ сервиса с ttsBegin; вызов действий; вызов ttsCommit/ttsAbort не получается сделать, т.е. нельзя просто взять и сделать откат в АХ.
Подскажите пожалуйста, каким образом можно реализовать откат на стороне АХ?
Старый 25.08.2016, 15:17   #2  
online
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Похожая тема
AIF - как экранировать вызовы throw в аксапте
Старый 25.08.2016, 17:48   #3  
lvan is offline
lvan
Участник
Аватар для lvan
Лучший по профессии 2014
 
858 / 82 (4) ++++
Регистрация: 15.04.2011
Записей в блоге: 1
я подобное спрашивал уже
вроде ничего простого нельзя сделать, потому что не поддерживаются транзакции
остаются только костыли
Старый 25.08.2016, 18:45   #4  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
А версия AX какая? Если AX2012, можно попробовать использовать message batch.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 26.08.2016, 09:06   #5  
MazZzDaI is offline
MazZzDaI
Участник
Аватар для MazZzDaI
 
44 / 35 (2) +++
Регистрация: 19.09.2013
Цитата:
Сообщение от Logger Посмотреть сообщение
Этот подход допустим в рамках одного действия сервиса

Цитата:
Сообщение от Maxim Gorbunov Посмотреть сообщение
А версия AX какая? Если AX2012, можно попробовать использовать message batch.
Message Batch применим для адаптера файловой системы. AX 2009

Цитата:
Сообщение от lvan Посмотреть сообщение
я подобное спрашивал уже
вроде ничего простого нельзя сделать, потому что не поддерживаются транзакции
остаются только костыли
Есть предположения костылизации?
Старый 26.08.2016, 09:28   #6  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от MazZzDaI Посмотреть сообщение
При интеграции AX и стороннего приложения (СП) появилась необходимость использования транзакции на несколько последовательных действий, например:
1. СП вызывает сервис создания данных в АХ; АХ создаёт данные и возвращает ответ СП; СП сохраняет у себя результат;
2. СП вызывает сервис разноски ранее созданных данных в АХ; АХ выполняет действие и возвращает результат об успешной разноске; СП фиксирует у себя успех.
Схема простая, но добавив вероятность падения канала связи, СП не получит ответ 2 и откатит (rollback) свою транзакцию, включая результат 1.
Кажется, это называется chatiness: у вас в СП есть одна транзакция на оба действия (передачу данных и разноску документа), но в AX вы почему-то передаете это отдельными сообщениями вместо того, чтобы передать одним сообщением вида "прими данные и разнеси документ".
Цитата:
Сообщение от MazZzDaI Посмотреть сообщение
Предполагаю необходимость костылизации механизма, например, удаление данных разноски АХ при возобновлении связи, согласование данных, стек данных, время жизни документа; но такое решение не масштабируемое и громоздкое.
В целом, мне кажется, любая синхронная интеграция с выполнением разноски в Аксапте будет не масштабируемой и громоздкой. Но если у вас в СП отправка и получение результата разноски для простоты сделаны в одной транзакции, то и в АХ это должно быть одно сообщение.
А вообще, по поводу разносок в AIF - как раз сейчас идет обсуждение в другой ветке
Старый 14.02.2017, 13:03   #7  
MazZzDaI is offline
MazZzDaI
Участник
Аватар для MazZzDaI
 
44 / 35 (2) +++
Регистрация: 19.09.2013
Решился описать решение, может кому пригодится

Созданы действия AIF для:
  • открытия транзакции AifTtsBegin(GUID _messageId, UserId _userId, DataAreaId _dataAreaId, int _transactionLifeTimeSec)
  • коммита - AifTtsCommit(GUID _messageId)
  • отката - AifTtsAbort(GUID _messageId)

Модифицирована таблица SysDatabaseLog:
  • добавлено поле messageId типа GUID;
  • добавлены методы для отката изменений в логируемых таблицах:
    • rollbackInsert - удаляет запись
    • rollbackUpdate - обновляет запись в предыдущее состояние
    • rollbackDelete - вставляет запись из лога
  • модифицирован метод insert, в котором производится запись в поле SysDataBaseLog.messageId значения AifTtsLog.messageId в контексте текущего пользователя запущенной сессии AX

Создана таблица AifTtsLog для отслеживания состояния AIF транзакций с набором полей:
  • messageId - GUID - уникальный идентификатор транзакции, в контексте которого производятся изменения данных и запись в SysDatabaseLog; устанавливается интегрируемой системой
  • userId - идентификатор пользователя, в контексте которого производятся изменения данных и запись в SysDatabaseLog; устанавливается интегрируемой системой
  • wsAbort - boolean - признак вызова отката транзакции; устанавливается интегрируемой системой
  • expirationDateTime - время жизни транзакции, по истечению которого AX запустит механизм отката транзакции
  • axAbort - boolean - признак, отображающий успешное завершение отката транзакции на стороне AX
  • wsCommit - boolean - признак коммита транзакции; устанавливается интегрируемой системой
  • axRollbackError - boolean - признак, отображающий возникновение ошибки в процессе отката транзакции на стороне AX

Создан класс AxTtsMonitor extends RunBaseBatch, который мониторит таблицу AifTtsLog и:
  • Запускает откат изменений при появлении признака wsAbort, или же при истечении времени жизни транзакции
  • Устананавливает признаки axAbort и axRollbackError
Миниатюры
Нажмите на изображение для увеличения
Название: AX_AifTts.png
Просмотров: 488
Размер:	122.7 Кб
ID:	11198  
За это сообщение автора поблагодарили: sukhanchik (5).
Теги
aif

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
AIF: Microsoft Dynamics AX Services and Windows Azure Service Bus Blog bot DAX Blogs 0 24.07.2013 03:13
daxdilip: How to: Configure Dynamics AX AIF Services to listen for SSL Requests (https) Blog bot DAX Blogs 0 23.01.2011 10:12
Dave: AIF Configuration and Additional Findings Blog bot DAX Blogs 1 04.11.2009 17:29
Dianne Siebold: AIF Top Ten Blog bot DAX Blogs 1 22.04.2008 11:19
Откат транзакции за вчерашний день??? Возможно в SQL2000??? director DAX: Администрирование 5 16.12.2005 11:26

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

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

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