5

必要なトランザクションメソッドを実装するセッションBeanがあるとします。

@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void doTransaction() throws Exception {
    try {
        ...
        // call to non-EJB bean object (not session, stateless or entity bean)
    } catch (Exception e) {
        context.setRollbackOnly();
        throw e;
    }
}

doTransaction()が非Beanオブジェクトの内部状態を変更し、失敗したとします。ロールバックは非Beanの元の状態を復元しますか?そうでない場合、そのようなケースを処理するための推奨される方法は何でしょうか?(または、トランザクション内のPOJO呼び出しは許可されていませんか?)

4

2 に答える 2

5

たとえば例外がスローされた後にEJBが自動的に実行するロールバックは、進行中の(JTA)トランザクションに参加しているリソースにのみ影響します。

このようなトランザクションに参加するには、いくつかの方法があります。最も完全な方法は、XAResourceインターフェースを実装し、コードにその実装を参加させることです。より単純ですが、それほど強力ではない方法は、シンクロナイザーを使用することです。

厳密に言えば、EJBコンテナもトランザクションマネージャ自体も何もロールバックしません。代わりに、参加したリソースにそのようなロールバックを実行する機会を与えます。したがって、トランザクション中に変更された確率変数の以前の値をそれ自体で復元することはできません。

完全を期すために、トランザクションに通常(自動的に)参加するリソース、データベース接続(コンテナー管理データソースからの場合)、JMSメッセージ(宛先がコンテナー管理の場合)、(分散)キャッシュ、およびJCAベースです。 EISリソース。

于 2012-11-10T16:16:32.210 に答える
0

JavaEEは、 Bean以外の変更をロールバックしません。ロールバックされるのはエンティティだけですが、DBから再度読み取った後でのみです。

この種のセマンティクスが必要な場合は、ソフトウェアトランザクショナルメモリ製品を使用する必要があります。

于 2012-11-10T15:44:34.400 に答える