05.05.2016, 04:13 | #1 |
Участник
|
Про сервисы и транзакции вопрос
Допустим, у меня есть Custom Service (в AX2012 R3, если это важно)
Он выполняет обновление БД в транзакции, а вызывается внешним приложением по сети (используется net tcp binding). Внимание вопрос: что будет, если связь по сети прервется в момент между вызовом сервиса но до получения ответа? обновление БД будет отменено или нет? Дело в том, что я словил один баг, и никак не могу его воспроизвести: внешнее приложение получило exception что-то типа time-out, но в AX транзакция осталась закоммиченой. |
|
05.05.2016, 09:55 | #2 |
Moderator
|
В целом - так оно и есть. Если ты хочешь целостность данных в распределенной системе поддерживать, то надо two phase commit реализовывать. Теоретически 2PC поддерживается в WCF (пример)
Но что-то я сильно сомневаюсь что тебе вся эта информация поможет, чтобы 2PC работал, открытием/закрытием/рециклингом соединений и транзакций должен WCF-host заниматься, а не AOS; Я как-то очень сомневаюсь что Аксапта сможет в таком режиме с базой данных работать... Последний раз редактировалось fed; 05.05.2016 в 10:55. |
|
|
За это сообщение автора поблагодарили: Logger (3), lvan (2). |
05.05.2016, 12:51 | #3 |
Участник
|
AX выполнит всю логику независимо от таймаута.
Это не баг, WCF тоже таймаут вернет, но функция продолжит выполнятся. Все вызовы Custom Service в транзакции выполняются по умолчанию и отменяются только если внутри вызова чтото не срослось. Имейте ввиду, что классы типа Box и Debug::assert ведут себя недружелюбно. Еще, насколько я помню, AIF вернет ошибку только если в коде произошел throw error. Если же в коде просто error(), AIF посчитает что все хорошо.
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
05.05.2016, 17:11 | #4 |
Участник
|
Короче я понял, AX2012 не поддерживает TransactionScope в WCF вообще.
Значит надо самому как-то это делать? кто-нибудь уже делал, и как? |
|
Теги |
service, two phase commit, wcf |
|
|