TOP比較データ> トランザクションの設定
徹底比較!!DIxAOPコンテナ
DIxAOPコンテナ「Seasar2とSpring」

第4回:Springの導入によるDIの実現
著者:豆蔵  長谷川 裕一、竹端 進   2005/12/2
前のページ  1  2  3  4
トランザクションの設定

   Springの宣言的なトランザクション対象となるメソッドの設定方法は、リスト6の4のように"<prop>"要素のkey属性にメソッド名を指定することによりおこないます。例えばaddEmployeeメソッドをトランザクション境界に指定する場合は、"<prop key=" addEmployee">"と記述します。

   メソッド名には「*」によるワイルドカードも使用できます。「add*」と指定することでメソッド名がaddではじまるものをすべてトランザクション対象とすることができます。

   またトランザクション対象となるメソッドには、トランザクション属性(表8)、トランザクションの独立性レベル(表9)、ロールバック対象の例外、非ロールバック対象の例外、トランザクションのタイムアウト秒、読込み専用トランザクションを設定することができます。
トランザクション属性 解説
PROPAGATION_MANDATORY トランザクションが開始されていない場合には例外をスローする
PROPAGATION_NESTED ネストしたトランザクションを開始する
PROPAGATION_NEVER トランザクションが開始されている場合には例外をスローする
PROPAGATION_NOT_SUPPORTED トランザクションを利用しない
PROPAGATION_REQUIRED トランザクションが開始されていなければトランザクションを開始する
PROPAGATION_REQUIRES_NEW 常に新しいトランザクションを開始する
PROPAGATION_SUPPORTS トランザクションが開始されていれば、そのトランザクションを利用する
トランザクションが開始していない場合はトランザクションを利用しない

表8:トランザクション属性

独立性レベル 解説
ISOLATION_READ_UNCOMMITTED 独立性に関知しない
ISOLATION_READ_COMMITTED 他のトランザクションが変更したが、まだコミットしていないデータは読み出せない
ISORATION_REPEATABLE_READ 他のトランザクションが読み出したデータは更新できない
ISORATION_SERIALIZABLE トランザクションを完全に独立させる
ISOLATION_DEFAULT データベースが提供するデフォルトの独立性レベルを利用する

表9:トランザクションの独立性レベル

   例えば以下のようなトランザクション管理を実現する場合、定義ファイルにはリスト11のように記述されます。

リスト11:トランザクションの設定例
<props>
     <prop key="update*">
          PROPAGATION_REQUIRED,
               ISOLATION_DEFAULT,
               timeout_180,
               -com.mamezou.mbeans.exception.MameApplicationException,
               +com.mamezou.mbeans.exception.DataNotFoundException
     </prop>
</props>
  • 対象メソッドが「update」ではじまるすべてのメソッド
  • トランザクション属性がRequired
  • 独立性レベルがDefault
  • タイムアウト秒が180秒
  • ロールバック対象の例外がMameApplicationException
  • 非ロールバック対象の例外がDataNotFoundException

表10:トランザクションの設定例


DIにおけるSeasar2とSpringの違い

   SpringのDIは定義ファイルにインジェクションするコンポーネントを明記しています。またSpringもSeasar2でいう自動バインディングと似た機能(Auto Wirringといいます)があります。

   しかしSpringのAuto Wiring機能はデフォルトでオフになっていることから、Springは定義ファイルにコンポーネント間の依存関係を明示したほうが、開発を進めやすくするという考えをもっていると思われます。つまり、コンポーネント間の依存関係をなるべく記述しないことで開発を進めやすくするSeasar2とは違う考えを持っているものと、筆者は理解しています。

   そのため、SpringのAuto Wiringの解説は本連載では省略しています。しかし、Auto Wiringやコンストラクションインジェクションも決して使ってはいけない訳ではありません。使うことによって開発が上手くいくならおおいに使うべきです。

   あの機能は使ってはいけないとかこっちの方が優れているとか、そのような考え方は本質を見失わせてしまいます。開発が上手くいくこと、保守がうまくいくこと、そういったことが本質なのです。


AOPの導入

   Springを導入し、インターフェースベース設計と宣言的トランザクション管理を導入したことにより、サンプルはAADL2以上となりAADL3にほぼ合致します。しかし、AOPを活用すればサンプルにはまだ改善できる点があります。例えばロギングや例外処理もできればEmployeeManagerImplのようなクラスから分離して、他のクラスと共通に利用したい部分です。

   次回の連載から、ロギング/例外処理をオブジェクトから分離する技術であるAOPについての概要、そして、Seasar2やSpringのAOP概要と開発現場でどのようにAOPを利用すべきかについて解説していきます。

前のページ  1  2  3  4


株式会社豆蔵 長谷川 裕一
著者プロフィール
株式会社豆蔵  長谷川 裕一
XMLの技術開発やCORBA、EJBを使用したシステム開発などを経て、現在はアジャイル開発プロセスの導入から工学的なソフトウエアプロセスの策定、オープンソースプロダクトに関するコンサルタント、アーキテクトとして常に第一線で活躍。共著として「プログラムの育てかた 現場で使えるリファクタリング(ソフトバンク)」、「Spring入門(技術評論社)」。


株式会社豆蔵 竹端 進
著者プロフィール
株式会社豆蔵  竹端 進
鉄鋼系SIerを経て現職に。現在はオープンソースプロダクトに関するコンサティング、開発支援、教育を行うチームに所属。日々、新たな技術をどのように生かしていくかを考える毎日。現在の注目対象はSeasar2とMaven。


INDEX
第4回:Springの導入によるDIの実現
  サンプルを用いたSpringによるAADL3への道
  宣言トランザクション管理
  Spring におけるDIの仕組みと設定方法
トランザクションの設定