アメリカではほとんどデフェクトスタンダードとなっている「」の覚書きです。Spring は簡単に言うと、IoC (制御の反転)、またの名を DI (依存性注入) という仕組みを取り入れた軽量コンテナです。

Springはとても抽象化した方法で、トランザクション管理を行います。抽象化というのは実装に依存していないという意味です。アプリケーションサーバが持つトランザクション機能や、 JDBCのようなリソースを使った DataSource に関しても、共通の方法でトランザクション管理を提供しています。

Springの詳細については、ほかにもっとよいサイト(Springフレームワークの紹介)があるので、そちらを参考にしてください。ここでは、Springを使っていて、ハマった点や気になった点などをメモしていこうと思います。随時更新していくつもりです。間違っている可能性が高いので、気になる点があればコメントをお願いします。

参考

Spring Pad - Wiki

JavaWorld 7月号 2004年

トランザクション管理

トランザクション管理機能

Springのトランザクション機能は、トランザクションマネジャというものが管理します。マネジャの設定もBean定義書で行います。Springのトランザクションマネジャは、JTA をサポートしていない DataSource に対しても宣言的なトランザクションをかけることが出来る。

宣言的なトランザクションとは、トランザクション境界(トランザクションの開始と終了)を宣言して、POJO のメソッドにトランザクション処理を行うことが出来るものです。例外が発生した場合に自動的にロールバックを行わせるものだと考えてください。

[参考]

Spring Pad - TransactionProxyFactoryBean

org.springframework.transaction.PlatformTransactionManager

Springのトランザクションマネジャの基本インターフェースのようです。

グローバルトランザクション
リソースを使わないトランザクション。JTAを使ってアプリケーションサーバが処理します。
ローカルトランザクション
JDBCなどのリソースを使用したトランザクション処理。

Springは、グローバルトランザクションとローカルトランザクションを透過的に扱うためにこのインターフェースを用意しています。

org.springframework.transaction.TransactionDefinition

トランザクション設定を定義するインターフェース

PROPAGATION_REQUIRED
トランザクションを実行する。
PROPAGATION_REQUIRES_NEW
メソッド呼出し毎に新しいトランザクションを実行する。
PROPAGATION_MANDATORY
トランザクションを開始している必要がある。
PROPAGATION_NOT_SUPPORTED
トランザクションの開始に関わらず、メソッド呼び出しはトランザクションに含まれない。
PROPAGATION_SUPPORTS
トランザクションが開始されていれば、メソッドが実行される。開始されていなければ実行されない。
PROPAGATION_NEVER
トランザクションに参加しない。

コミット対象にする例外を追加するには、トランザクション属性に 「+《例外の型》」 をつける。ロールバック対象の例外を追加するには 「-《例外の型》」 をつける。

PROPAGATION_REQUIRED, +java.io.IOException

org.springframework.jdbc.datasource.DataSourceTransactionManager

一つのDataSourceのためのトランザクション実装です。DataSourceごとに一つのスレッドが対応します。JDBCのConnectionを利用してトランザクションを制御します。

参考

  • Spring の ロッドジョンソンが贈る、J2EE技術者のためのバイブル
  • Spring のロッドジョンソンによる Spring ユーザのための本 (洋書)
  • SpringでWebアプリケーションを作りながら、Springの全体像がわかりやすく解説されています。