開発中のDIコンテナですが、Seasar2のコードやSpringのコードを参考に宣言的トランザクションを実装してみました。
宣言的トランザクションとは、メソッドの呼び出し結果に対してトランザクションをロールバックもしくはコミットするルールを宣言するトランザクションです。例えばXXXメソッドを呼び出してRuntimeExceptionがスローされたらロールバック、Exceptionがスローされたらコミット、何事もなかったらコミット、というように宣言して使います。
トランザクションの対象となるのはメソッド単位です。トランザクションの対象となるメソッドからトランザクショナルなメソッドが呼び出された場合の処理方法は数種類あります。
|
トランザクションがある場合 |
トランザクションがない場合 |
| Required |
何もしない |
TXを開始する |
| RequiresNew |
既存のTXを中断して新しいTXを開始 |
新しいTXを開始 |
| Mandatory |
何もしない |
エラー |
| Never |
エラー |
何もしない |
| NotSupport |
既存のTXを中断 |
何もしない |
と、大雑把にこんな感じです。これらのトランザクションをメソッドに割り当てるのはAOPによって割り当てるます。AOPで割り当てる事によって、業務ロジックの中にトランザクション処理を書く必要は一切ありません。アトミックな業務単位をメソッドに割り当てるだけです。
ただしRequiredのようなトランザクションの場合、すでに存在するトランザクションに参加できますので、メソッドを細切れにしても、最初の呼び出しから完了までがアトミックな業務単位となります。
#といっても、Javaでは最近ポピュラーになってきましたが、数年前からVB6とかでもCOM+でできていたんですよね。.NETな人達からすると、何を今更って感じなんだろうな・・・