2016-06-01 15 views
2

私は春のブートに取り組んでおり、transactionの管理に関して何かを明確にする必要があります。安心してご利用いただける春の取引

たとえば、2つの別々のジョブを実行する2つのクラスがあります(最初のジョブはデータベースでプロファイルを作成し、2番目のジョブはプロファイル作成もプロファイル作成も別のシステムで呼び出すことです)。

この2つのジョブはトランザクションでなければなりません。どちらの成功も必要でした。ジョブの1つが失敗した場合は、データストア上にプロファイルを作成しないでください)

私はこのことで本当に新しいですからです。このシナリオのベストプラクティスが何であるかを知る必要があります。

答えて

2

facade patternがあります。私は、facade serviceを2つのサービスのロジックに参加させることを提案します。プロファイルの操作や他のシステムとの通信はビジネスロジックのさまざまな部分であるため、サービスは別々にする必要があります。

たとえば、プロファイルと外部通信には、ProfileServiceOuterServiceがあります。 SomeFacadeServiceと書いて2つのメソッドを結合し、1つのトランザクションでラップすることができます。 @Transactionalのデフォルト伝播はREQUIREDです。したがって、トランザクションはメソッドSomeFacadeService.doComplexJobで作成され、メソッドprofileService.createProfileouterService.doOuterJobは現在のトランザクションに参加します。そのうちの1つに例外が発生すると、SomeFacadeService.doComplexJob全体がロールバックされます。

@Controller 
public class SomeController { 
@Autowired 
      SomeFacadeService someFacadeService ; 

    @RequestMapping("/someMapping") 
    public void doSomeJob() { 
     someFacadeService.doComplexJob(); 
    } 
} 

@Service 
     public class SomeFacadeService { 
      @Autowired 
      ProfileService profileService; 
      @Autowired 
      OuterService outerService; 

      @Transactional 
      public void doComplexJob() { 
       profileService.createProfile(); 
       outerService.doOuterJob(); 
      } 
     } 

     @Service 
     public class ProfileService { 
      @Transactional 
      public void createProfile() { 
       // create profile logic 
      } 
     } 
+0

ありがとう@doge、このアプローチを今すぐテストして、アップデートを共有します! – lxnx

+0

申し訳ありません@doge、私は簡単な説明が必要です。 outerService.doOuterJob()で、プロセスの結果を示すBooleanを返す必要がありますか? – lxnx

+2

いいえ、何らかの理由で結果が必要ない場合は、ただ例外を投げるだけで十分です。 –

関連する問題