28

「EJB 3.0 のマスター」のトランザクションの章 (10) を読んだところですが、ネストされたトランザクションについて混乱しています。

その本は言う

「EJB 定義のトランザクション マネージャーは、ネストされたトランザクションをサポートしていません。フラットなトランザクションのみをサポートする必要があります。」(サイト278、注意)

この事実はこの本だけでなく、他の本やウェブサイトにも書かれています。

しかし、"Requires New" アノテーション付き Methode から "Required" アノテーション付き Methode を呼び出すと、ネストされたトランザクションになりますよね? 外部トランザクションに影響を与えることなく、内部トランザクションをロールバックまたはコミットできます。また、外側のトランザクションを中止したい場合は、EJBException をスローして戻すと、トランザクション全体がロールバックされます。

この動作がEJB 3.0 仕様で要求されていないということだけですか、それとも何か誤解しているのでしょうか? ネストされたトランザクションと説明されている動作の違いがわかりません。

よろしくノーマン

4

2 に答える 2

47

RequiresNew は、ネストされたトランザクションを作成しません。これは、2 番目のトランザクションの実行中に最初のトランザクションが中断されるためです。ネストされたトランザクションは次のようになります。

Nested transaction example
> method1 - begin tran1
  > method2 - begin tran2
    workA
  < method2 - commit tran2
< method1 - rollback tran1 (tran2 also rolled back because it's nested)

代わりに、RequiresNew は次のようになります。

EJB RequiresNew example
> method1 - begin tran1
  > method2 - suspend tran1, begin tran2
    workA
  < method2 - commit tran2, resume tran1
< method1 - rollback tran1 (tran2 remains committed)
于 2012-05-30T17:18:54.073 に答える
9

簡単な答えは、新しいトランザクションが開始される前に「外部」トランザクションが中断されることです。2 つのトランザクションの運命は決してリンクしていません。

REQUIRES_NEWメソッドが をスローした場合、EJBExceptionロールバックされるのは、「外部」トランザクションではなく、メソッドが作成した新しいトランザクションです。

于 2012-05-30T17:19:17.993 に答える