Откат распределенной транзакции с помощью Spring-Boot - PullRequest
1 голос
/ 26 марта 2020

Я изучаю откат распределенных транзакций с помощью Spring-Boot. Я использую весеннюю загрузку 2.2 с базой данных JPA и H2. В моем примере у меня есть три микросервиса, которые работают на разных портах с собственной базой данных H2.

MicroserviceA --- http://localhost: 2222 / savePersonBasicDetails
MicroserviceB --- http://localhost: 3333 / savePersonAddress
Микросервис C --- http://localhost: 4444 / savePersonHobbies

Из MicroserviceA, I получит Person_Id, который я отправлю оставшимся двум микросервисам вместе с соответствующими данными. В случае сбоя любого из микросервисов я хочу откатить всю транзакцию.

Пример:

сохранить (PersonVO personVO) {

Integer personId = microserviceA.savePersonBasicDetails(personVO);

microserviceB.savePersonAddress(personId, personVO);

microserviceC.savePersonHobbies(personId, personVO);//If it fails in microserviceC,     

                                              //then the complete transaction should be rolled back.

}

Я пытался использовать @Transactional (rollbackFor = Exception.class) для метода save (), но транзакция не откатывается.

Пожалуйста, предложите.

1 Ответ

1 голос
/ 26 марта 2020

Вы смешиваете термины. Распределенная транзакция - это термин, связанный с СУБД, а не с веб-сервисами. Существует стандарт веб-сервиса для транзакций через веб-сервис WS-TRANSACTION, относящийся к soap веб-сервисам. Но этот стандарт в основном не используется.

Обычно в контексте веб-служб используется термин «компенсация транзакции», и вы можете искать его. Очень распространенным шаблоном компенсации является шаблон «Подтвердить отмена подтверждения», также существуют различные подходы.

Если вы настаиваете на использовании распределенных транзакций, перейдите по этой ссылке: https://www.atomikos.com/Blog/TransactionalRESTMicroservicesWithAtomikos

...