Hatena::Groupcatalyst

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

2008-03-24

トランザクション境界の設定について

20:33 |  トランザクション境界の設定について - dann@catalyst を含むブックマーク はてなブックマーク -  トランザクション境界の設定について - dann@catalyst  トランザクション境界の設定について - dann@catalyst のブックマークコメント

トランザクション境界はサービス層のインタフェースで設定されるべきものなんだろうなと思っています。Java界隈ではこのようなトランザクション境界になるインターフェースをもつクラスをサービスと呼ぶことが多いです。

Serviceのメソッド内でトランザクションの開始や終了のコードを記述してしまう場合、そのServiceクラスのロジックがDBに依存してしまうため、Testabilityを考えると望ましくありません。DBなしではテストがしにくくなるからです。Java界隈ではAOP + DIコンテナでこの問題を解決しています。具体的には、AOPのインターセプタでサービスクラスのメソッドの前後でトランザクションの開始・終了をできるようにするということをやっています。このようにすることで、サービスクラスのロジックには、トランザクションの開始・終了のロジックが入らないため、そのクラスはトランザクションマネージャには依存せず、単体でテストができるようになります。

DBIx::Classを使う場合、どのようにしたらよいのかを少し考えてみました。

DBIx::Classでは、Schemaのtxn_doのメソッドを使って、Unit of workの実行をするのが推奨されているようです。このメソッドは、実行したいUnit of workを、トランザクションの開始と終了で挟んでくれるラッパーメソッドなのですが、これを使うということは、Serviceのロジック中にトランザクションの開始・終了のコードが埋まってしまうことになります。

これだとテストがしにくくなるので、ServiceのロジックをDBに依存せずに単体でテストをするには、どのような方法があるかを考えてみました。

コードをみた限りでは、

Schemaのtxn_doをオーバーライドして、トランザクションの開始、終了を行わないコードにオーバーライドする」

というのが一番簡単でLLらしい解なのではないかと思いました。

これだったら簡単にできますし、割と現実的な気がします。Perl界隈でAOPが流行らないのも、こうしたmonkey patchingで回避できてしまうからというのもあるのかなという気もします。

# LogicパッケージはServiceパッケージに名前を変えることにしました(名前だけ変えただけなんですが)

ChiekoChieko2012/11/01 15:31I was struck by the honesty of your potisng

aiyuyrgcaiyuyrgc2012/11/02 09:387BKNqu <a href="http://ijiiwgkjkaif.com/">ijiiwgkjkaif</a>

ilriywkxakilriywkxak2012/11/02 14:161SPQ1u , [url=http://zmmsipceuptq.com/]zmmsipceuptq[/url], [link=http://tusdfnnozdtx.com/]tusdfnnozdtx[/link], http://opfewxqzzglm.com/

zurniozurnio2012/11/04 22:5754iu8a <a href="http://zxsyrcqrfrng.com/">zxsyrcqrfrng</a>

rohkpwrohkpw2012/11/05 12:17OwmVsT , [url=http://ckwpxlidpoej.com/]ckwpxlidpoej[/url], [link=http://wgbfbocmmjow.com/]wgbfbocmmjow[/link], http://pwztavcxwtnm.com/

トラックバック - http://catalyst.g.hatena.ne.jp/dann/20080324