最近あまり触れていないJavaEEのトランザクションについて。
JavaEEの場合、EJB環境では@Statelessを付けることによりトランザクション管理を行うことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
@Statless public SampleEJB{ public void func1(){ func2(); func3(); } public void func2(){ //データベースに登録する } public void func3(){ //データベースに登録する } } |
トランザクション管理が必要となるのはやはり1つのメソッドではなく、複数のメソッドが動いているときです。
例えば上記の例でfunc2とfunc3がともにデータベースに何らかのデータを登録するような作業を行っているとします。
この場合、func2が成功しても、func3が失敗した場合、ロールバックが走りfunc2もなかったものとなります。
これによりデータの安全性、一貫性が保たれます
この仕組みがよくわかっていない時は下記のようなメソッドを書いてトランザクションの動きを無視していました・・
下記の例ではEJBのメソッドを外部から呼び出しているため、単一のメソッドに対して、コミットが発生してしまいます。func3がダメでもfunc2が登録されてしまいます。
1 2 3 4 5 6 7 8 9 10 11 |
public SampleBean @Inject SampleEjb sampleEjb; public void func(){ sampleEjb.func2(); sampleEjb.func3(); } } |
このように便利なEJBのトランザクション管理ですが、全ての例外に対して必ず動くわけではありません。一部例外もあるため、その場合は自前でrollbackを実装する必要があります。詳しくはリンクを参照。
参考リンク
金魚本第9章