Seasar DI Container with AOP

トランザクションの自動制御

S2Txの機能を使い、POJO(普通のJavaのクラス)に対して、 トランザクションの自動管理機能を組み込むことができます。

トランザクション属性

Seasar2が標準で用意しているj2ee.diconには、 トランザクション属性に対応したAdviceが定義されています。 j2ee.diconはs2-extension-x.x.x.jarに含まれているので、 開発者のほうで用意する必要はありません。

これらのAdviceは、aspectタグアスペクトの自動登録SMART deployによるトランザクション設定 を使ってコンポーネントに適用します。

属性 コンポーネント名 説明
Required j2ee.requiredTx トランザクションが開始されていなければ、
自動的にトランザクションを開始します。
既にトランザクションが開始されていれば、
そのトランザクションを引き継ぎます。
RequiresNew j2ee.requiresNewTx 常に新しいトランザクションを開始させます。
既存のトランザクションが開始されているなら、
既存のトランザクションを中断し、
自分自身のトランザクションの終了後、
中断したトランザクションを復帰させます。
Mandatory j2ee.mandatoryTx トランザクションが既に開始されてなければエラーにします。
NotSupported j2ee.notSupportedTx 既存のトランザクションが開始されているなら、
既存のトランザクションを中断します。
コンポーネントのメソッドの終了後、
中断したトランザクションを復帰させます。

例外発生時の動作

デフォルトだとコンポーネントが例外をスローした場合はトランザクションをロールバックしますが、 発生した例外に応じてトランザクションをコミットするかロールバックするかを指定することもできます。

  • addCommitRule(Class)メソッドを使用すると、 トランザクションをコミットする例外を指定することができます。
  • addRollbackRule(Class)メソッドを使用すると、 トランザクションをロールバックする例外を指定することができます。

コンポーネントから例外がスローされると、 addCommitRule()/addRollbackRule()が設定された順番にマッチするかチェックされます。 スローされた例外がaddCommitRule()/addRollbackRule()で指定された例外またはその派生例外であれば、 その設定に従ってトランザクションをコミットまたはロールバックします。 スローされた例外がaddCommitRule()/addRollbackRule()で指定された例外とマッチしない場合、 トランザクションはロールバックされます。

EJB互換のAdvice

Seasar2が標準で用意しているejbtx.diconには、 EJBのコンテナ管理トランザクション (CMT) と同じように実行時例外 (java.lang.RuntimeException)、 リモート例外 (java.rmi.RemoteException) とその派生例外が発生した場合はロールバックし、 その他の例外 (java.lang.Exception) が発生した場合はコミットするAdviceが定義されています。 ejbtx.diconはs2-extension-x.x.x.jarに含まれているので、 開発者のほうで用意する必要はありません。

属性 コンポーネント名
Required ejbtx.requiredTx
RequiresNew ejbtx.requiresNewTx
Mandatory ejbtx.mandatoryTx
NotSupported ejbtx.notSupportedTx

SMART deployでの利用

SMART deploy環境でトランザクションの自動制御を利用する場合の設定については、 「DI Container」-「トランザクション制御を設定する」を参照してください。