私は春ブーツと分散トランザクションのロールバックを学んでいます。私はJPAとH2データベースと春ブート2.2を使用しています。私の例では、私は自分のH2データベースで、異なるポート上で実行されている3マイクロサービスを持っています。
MicroserviceA --- のhttp:// localhostを:2222 / savePersonBasicDetails
MicroserviceB --- のhttp:// localhostを:3333 / savePersonAddress
MicroserviceC --- のhttp:// localhostを:4444 / savePersonHobbies
MicroserviceAから、私は私が彼らのそれぞれのデータと一緒に、残りの2 microservicesに送信されますPERSON_IDを取得します。microservicesのいずれかが失敗した場合、私は完全なトランザクションをロールバックします。
例:
保存(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.
}
私はsave()メソッドに@Transactional(rollbackFor = Exception.class)で試してみましたが、トランザクションはロールバックされていません。
してください提案。
あなたは、用語を混合しています。分散トランザクションは、RDBMSではなく、Webサービスに関連した用語です。石鹸のWebサービスに関連するWebサービスのWS-TRANSACTIONオーバー取引のためのWebサービス標準があります。しかし、この規格は、主に未使用です。
Webサービスのコンテキストで使用usualyサームは、取引報酬であり、あなたはそれを検索することができます。補償のための非常に一般的なパターンは、試しキャンセル確認パターンで異なるaproachesもあります。
あなたは、分散トランザクションを使用して主張する場合、このリンクをチェックアウト:https://www.atomikos.com/Blog/TransactionalRESTMicroservicesWithAtomikos