4

Ejb3.0、Weblogic 11g、JDBCを使用する

別のデプロイメントEARでリモートで実行されているメソッドを呼び出しています。

呼び出されているリモートデプロイメントのメソッドですが、 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

問題は、リモートメソッドが呼び出される前にデータベースで実行するすべてのロジックが、リモートメソッドが終了するまでコミットされないことです。

私が喜んで行うのは、「前」のロジックを実行させ、リモート呼び出しの後に戻って通常どおり続行することをコミットすることです。

何か案が?

説明するいくつかのコード:

@CallByReference
@Stateless(mappedName = "ejb/OperatorProccessBean")
@Local({ OperatorProccessBeanLocal.class })
@Remote({ OperatorProccessBeanRemote.class })
public class OperatorProccessBean implements OperatorProccessBeanLocal,  
 OperatorProccessBeanRemote
{   

...

   SBNDispatchBeanRemote SBNDispatchBean = (SBNDispatchBeanRemote) context.lookup("ejb/SBNDispatchBean#com.mirs.sbn.dispatch.SBNDispatchBeanRemote");
    if (SBNDispatchBean == null)
    {
            logger.error(TAG + " SBNDispatchBean is null");

    }
    else
    {
         //until here I want all my data to be commited without waiting for the upcoming remote method to finish
         SBNDispatchBean.updateSubscriberInBlockingList(...);
    }
...
 }

これで、メソッドupdateSubscriberInBlockingList()に注釈が付けられ ます

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

そのメソッドが呼び出される前にデータをコミットしたい。

よろしくお願いします、レイ。

4

2 に答える 2

3

これで、メソッドupdateSubscriberInBlockingList()に@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)という注釈が付けられます。

そのメソッドが呼び出される前にデータをコミットしたい。

コンテナ管理のトランザクションを使用している場合、それは不可能です。この背後にある理論的根拠は、コンテナがすでにトランザクションを実行しているときに、新しいトランザクションを開始すると、元のトランザクションが一時停止されるということです。新しいトランザクションがコミットされると、元のトランザクションが再開されます。

この動作は構成できません。EJBコンテナとJTAトランザクションマネージャは、X /OpenDTPトランザクションモデルから派生したJTA仕様で指定された動作に準拠していることが期待されます。X / Open DTPモデルでは、新しいトランザクションが開始され、別のトランザクションが進行中の場合、現在のトランザクションは一時停止され、後で再開されます。現在のトランザクションをコミットして新しいトランザクションを開始することを可能にするトランザクションモデルはないことに注意してください(私はすべてを研究していません)。ネストされたトランザクションまたは一時停止されたトランザクションがさまざまなトランザクション処理モデルでサポートされているのを見ただけです。

作業をコミットする場合は、既存のトランザクションコンテキストを完全に終了して、既存のトランザクションをコミットしてから、新しいトランザクションを開始する必要があります。

于 2011-06-14T11:42:19.623 に答える
1

「リモート呼び出しの前」ロジックを、REQUIRES_NEWで注釈が付けられた別のBeanメソッドにも配置します。したがって、3つのトランザクションがあります。

  • 1つはメインメソッド用です(ただし、リモート呼び出しが完了するまで何も実行されません)。
  • 1つはリモート呼び出し前のロジック用です。
  • 1つはリモートコール用です。
于 2011-06-14T11:45:29.677 に答える