「EJB3.0のマスタリング」のトランザクションの章(10)を読んだばかりですが、ネストされたトランザクションについて混乱しています。
本は言う
「EJB定義のトランザクションマネージャはネストされたトランザクションをサポートしていません。フラットトランザクションのみをサポートする必要があります。」 (サイト278、注)
この事実はこの本だけでなく、他の本/ウェブサイトでもこの声明を見つけました。
しかし、から「Requires New」アノテーション付きメソッドを呼び出すと、「Required」アノテーション付きメソッドとしましょう。私が持っているのはネストされたトランザクションですよね。外部トランザクションに影響を与えることなく、内部トランザクションをロールバックまたはコミットできます。また、外部トランザクションを中止したい場合は、EJBExceptionをスローして戻し、トランザクション全体をロールバックします。
それで、この動作は、EJB 3.0仕様による必須ではありませんであるだけですか、それとも私は何かを誤解していますか?ネストされたトランザクションと説明されている動作の違いを理解できません。
よろしくノーマン
2番目のトランザクションの実行中に最初のトランザクションが一時停止されるため、RequiresNewはネストされたトランザクションを作成しません。ネストされたトランザクションは次のようになります。
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)
簡単な答えは、新しいトランザクションが開始される前に「外部」トランザクションが一時停止されることです。 2つのトランザクションの運命はまったく関連していないため、すべての意図と目的によって、一方が他方にネストされることはありません。
REQUIRES_NEW
メソッドはEJBException
をスローします。これは、「外部」トランザクションではなく、ロールバックされる作成された新しいトランザクションです。