Hatena::Groupcatalyst

dann@catalyst このページをアンテナに追加 RSSフィード

2008-04-02

AOPによる宣言トランザクションとDBIx::Class::Service

01:56 |  AOPによる宣言トランザクションとDBIx::Class::Service - dann@catalyst を含むブックマーク はてなブックマーク -  AOPによる宣言トランザクションとDBIx::Class::Service - dann@catalyst  AOPによる宣言トランザクションとDBIx::Class::Service - dann@catalyst のブックマークコメント

DBIx::Class::Service

http://d.hatena.ne.jp/ZIGOROu/20080401/1207037478

DBIx::Class::Serviceの仕組みは、JavaAOPによる宣言トランザクションの仕組みにとても近いです。クラス登録時にTransationアトリビュートがついていたら、トランザクションの開始・終了を行うようなProxyクラスでラッピングしてやるわけです。

Javaではこれをバイトコードレベルでそういうコードを差し込む形になっています。AOPでTransation用のInterceptorを設定してやると、そのメソッドはトランザクショナルなメソッドになります。このときに、サービスのクラスには一切トランザクションのコードが埋まっていないわけです。

DBIx::Class::Serviceと、JavaでのAOPの宣言トランザクションの仕組みはとても似ていますが、仕組み以外では少し違うところがあります。Javaでいう宣言トランザクションの仕組みは、ORマッパには全く依存していません。トランザクションのAPIJTAAPI)にしか依存していません。そこが大きな違いです。

ただ、将来的に同じような仕組みで実現されていくのではないかと思います。Javaと同じように以下の形になっていくのではないかと思います。

  • DIコンテナがサービス登録時に、トランザクショナルなProxyを介してトランザクショナルなメソッドに変換するのはする
  • 宣言トランザクションはメソッドのアトリビュートとして指定する
  • トランザクションの開始・終了は、ORマッパに依存させない
  • サービスというクラスは、ORマッパの外にある Service->ORマッパ といった構成になる。

Bread::Boardを使った場合には、

「serviceの定義にtransactional_methodsというトランザクショナルなメソッドを指定するものを用意して、そこにメソッドが指定されていた場合には、before, afterでトランザクション開始終了を行うようなServiceとして登録する」

といったような形での実装になっていくのではないかと思います。

ただ、DBIx::Class::Storage::DBIの実装を見ると、切り離すのは少し面倒そうだなぁという気はします。

何故宣言トランザクションがJava界隈でもてはやされているかというと、宣言トランザクションの仕組みがあれば、サービスのクラスのビジネスロジックがトランザクションの管理から解放され、それがPOJOとして扱えるからです。

これはTestabilityの点で望ましいということになります。これについては、PerlでもJavaでも変わらないかなとは思います。

ただ、以前も書きましたが、DBIx::Classだけを用いる場合でも、テスト時にtxn_doメソッドをMonkey Patchingでトランザクショナルなメソッドにしないようにしてしまってもいいわけで、労力をかけて頑張ろうという気になれないのも確かです。

MccadeMccade2011/08/02 12:38This forum needed sakhing up and you've just done that. Great post!

kmeyilypzkmeyilypz2011/08/03 20:4915ggJ4 , [url=http://qeznvwezdxfs.com/]qeznvwezdxfs[/url], [link=http://nuwhqfxgeivl.com/]nuwhqfxgeivl[/link], http://srnfyjntrpcw.com/

hvqabaqxdhvqabaqxd2011/08/05 22:13fSEfDn , [url=http://hitejlqemnsf.com/]hitejlqemnsf[/url], [link=http://ldrpnarvjijm.com/]ldrpnarvjijm[/link], http://mvfzvlgrqjjn.com/