2005.09.20 株式会社四次元データ 木虎直樹
7.2. プログラマティックなトランザクション管理
トランザクション管理を行う必要があるメソッドが少ない場合にはプログラマティックなトランザクション管理を行う方が手軽な場合があります。プログラマティックなトランザクション管理を行うには
org.springframework.transaction.support.TransactionTemplate
を使用します。TransactionTemplate
がもつ主な setter メソッドは以下の 4つです。
- void setPropagationBehavior(int propagationBehavior)
- void setIsolationLevel(int isolationLevel)
- void setReadOnly(boolean readOnly)
- void setTimeout(int timeout)
対応するプロパティやトランザクション属性については名前から自明ですので説明は省略します。トランザクション管理を行うには以下のシグネチャを持つ execute() メソッドを呼び出します。
execute()
メソッド内で非検査例外が発生すると自動的にロールバックされるのは宣言的トランザクション管理のデフォルト設定と同じです。Object execute(TransactionCallback action) throws TransactionException引数には
TransactionCallback
を実装したクラスを渡します。TransactionCallback
には以下の 2種類が存在し、それぞれトランザクション終了時に値を返す場合と返さない場合とで使い分けます。
org.springframework.transaction.support.TransactionCallback
org.springframework.transaction.support.TransactionCallbackWithoutResult
それぞれで実装しなければならないメソッドのシグネチャは以下の通りです。いずれも
org.springframework.transaction.TransactionStatus
を引数にとり、非検査例外の発生時以外でロールバックする必要がある場合にはメソッド内で TransactionStatus#setRollbackOnly() メソッドを呼び出します。Object doInTransaction(TransactionStatus status)void doInTransactionWithoutResult(TransactionStatus status)以下に使用例を示します。例にあるように
TransactionCallback
を実装した無名クラスを作成するのが一般的です。PlatformTransactionManager tm = (PlatformTransactionManager) context.getBean("transactionManager"); TransactionTemplate tt = new TransactionTemplate(tm); tt.execute(new TransactionCallbackWithoutResult() { protected void doInTransactionWithoutResult(TransactionStatus status) { try { insert(); update(); } catch (MyCheckedException e) { status.setRollbackOnly(); } } });
実習課題 2
6章の実習課題 1 を改良しなさい。
- 宣言的トランザクション管理ではなくプログラマティックなトランザクション管理を行うこと