1
  1. TransactionAttribute.REQUIRES_NEW で注釈が付けられた EJB メソッド methodA() があります。
  2. methodA() は、リモート サーバーで実行されている 2 つの EJB メソッド (たとえば、methodB()、methodC()) を呼び出します (IIOP 通信)
  3. methodB() はデータベースの挿入をほとんど実行しません.. methodB には TransactionAttribute.REQUIRED の注釈も付けられています
  4. methodC() にも TransactionAttribute.REQUIRED の注釈が付けられており、トランザクション管理をテストするためにランタイム例外をスローさせています。
  5. トランザクション管理のために methodA をテストすると、次のことに気付きました..

OpenEJB ログでは、

  1. TX Requires_New: 中断するトランザクションはありません。

  2. TX Requires_New : 開始されたトランザクション ... gerenimo TransactionImpl ....

  3. methodBの実行からのログ...完了。

  4. methodC はいくつかの RuntimeException をスローします

  5. TX Requires_New : トランザクションをロールバックしています...

============

トランザクションがロールバックされていると表示されていても、methodA() を介して保存されたデータベース レコードは引き続きデータベースに表示されます。データベースの挿入もロールバックする必要があります。

何が問題なのかを理解するのを手伝ってもらえますか?

4

1 に答える 1

0

問題は、methodA、B、および C が異なるトランザクション コンテキストで実行されているため、プロセス内で分離して実行されている 3 つの異なる独立したトランザクションがあることです。

各 appserver は、同じサーバーにデプロイされた EJB によって共有されるトランザクション コンテキストを定義します。

リモート サーバーで実行されている EJB を呼び出す場合、現在のトランザクションは使用されません。

異なるリモート サーバーで同じトランザクションを共有する場合は、分散トランザクションを実装する必要があります。

于 2013-06-23T02:21:09.773 に答える