2

次の状況があります。

  • App1 ear — DB 作業を行ういくつかのサービスを保持するアプリケーション。
  • App2 ear — App1 サービスを使用する別のアプリケーション。
  • どちらも同じ JVM で実行されています。アプリケーション サーバーは JBoss7 です。
  • App2 は、App1 のサービスを呼び出す前後に、さらに DB 作業を行います。

サービスの App2 にメソッドがあるとしましょう:

void method(){
   doDBWorkinApp2();
   callApp1ServiceToDoMoreDBWork();
   moreDBWorkinApp2();
}

このメソッドを単一のトランザクションで実行したい。どうやってやるの?

4

1 に答える 1

4

ステートレスであると想定すると、トランザクション/永続スコープは一般に伝播されます。ただし、各メソッドに使用するトランザクション属性 (NOT_SUPPORTED、SUPPORTS、MANDATORY など) と伝播のいくつかのルール (ルール: https://weblogs.java.net/blog/ss141213/archive/ ) を考慮してください。 2006/10/persistence_con.html )。

トランザクション スコープのエンティティ マネージャがトランザクション内から呼び出された場合、トランザクションに関連付けられた永続コンテキストがまだ存在しない場合は、新しい永続コンテキストが作成されます(Enterprise JavaBeans 3.0) 。

したがって、2 つのステートレスにデフォルトの Tx 属性 (REQUIRED) を使用している場合: それらは同じコンテキストを共有するため、1 つのメソッドが失敗するとすべてがロールバックされます。この動作を望まない場合でも、 (REQUIRES_NEW , NOT_SUPPORTED ..) のようなものを使用できます。

トランザクション属性の詳細: http://docs.oracle.com/javaee/6/api/javax/ejb/TransactionAttributeType.html

編集: 複数の EAR の場合、各 EJB にはコンテキスト (一種のクライアント コンテキスト) があり、呼び出された EJB の TransactionAttribute に従って伝播されます。これは、ローカル呼び出しにのみ当てはまります。リモート EJB 呼び出し間で永続化コンテキストを共有できないことに注意してください。

于 2013-10-11T04:21:45.540 に答える