Springのトランザクションマネージャを明示的に使う
Springの入門記事は大抵AOPでトランザクション境界を定義するやりかたを紹介している。それはそれでKeep POJOの観点から理想的なのだが、初心者は設定間違いなどにより実際にはトランザクション制御が効いていないようなケースでもそれに気付かず過ごしてしまうかもしれない。AOPを使わず明示的にトランザクション境界をコーディングしてみて、その後にAOPでの解決法へ移行する方がそういったミスを見過ごすことがないという意味では入門に適していると思う。
注意しておかなくてはならないのは、データベースアクセスを伴う処理を Springのトランザクションマネージャによるトランザクション制御の影響下に収めるためには守らなければならない約束事があるということだ。それは、少なくとも下記のうちいずれかの方法でデータベースへアクセスすることである。
・dataSource.getConnection() のかわりに、 DataSourceUtil.getConnection(dataSource) でJDBCコネクションを得る。コードはSpring依存になる。
・全てのSQLを JdbcTemplate クラス経由で実行する。コードは Spring依存になる。
・DataSourceオブジェクトを TransactionAwareDataSourceProxy で包んでおき、それに対して getConnection() が行われるようにする。
後々 Keep POJOでAOPなトランザクション制御へ移行する予定なら最後の方法を使うと良い。
DefaultTransactionDefinition def = new DefaultTransactionDefinition();transactionManagerは PlatFormTransactionManager(実体は DataSourceTransactionManagerなど)で、これは Spring Framework独自のトランザクションマネージャである(JEEのトランザクション管理機構を使いたい場合はこのトランザクションマネージャでラップして使う)ため、これを明示的に使用したコードは Springに依存することになる。
TransactionStatus status = transactionManager.getTransaction(def);
try {
// ここでトランザクションの中身を実行
transactionManager.commit(status);
}
finally {
if (!status.isCompleted()) transactionManager.rollback();
}
注意しておかなくてはならないのは、データベースアクセスを伴う処理を Springのトランザクションマネージャによるトランザクション制御の影響下に収めるためには守らなければならない約束事があるということだ。それは、少なくとも下記のうちいずれかの方法でデータベースへアクセスすることである。
・dataSource.getConnection() のかわりに、 DataSourceUtil.getConnection(dataSource) でJDBCコネクションを得る。コードはSpring依存になる。
・全てのSQLを JdbcTemplate クラス経由で実行する。コードは Spring依存になる。
・DataSourceオブジェクトを TransactionAwareDataSourceProxy で包んでおき、それに対して getConnection() が行われるようにする。
後々 Keep POJOでAOPなトランザクション制御へ移行する予定なら最後の方法を使うと良い。
ラベル: Spring

2 件のコメント:
try 節の中で OutOfMemoryError がスローされたらどうすんだよぅ?
答えなよ!コラ!
ハイハイナオシマシタヨー
コメントを投稿
<< ホーム