前の記事 で見たプログラムによるトランザクションを見ていきます。
実はSpringが提供するプログラムによるトランザクション管理は、2種類あります。
その2つ目です。
1つ目は、こちら を参照。
サンプルを中心に見ていきます!
【ビジネスロジック】public interface MemberService{ List<String> find(String name); } //setter/getterは記述を省略しています public class MemberServiceImpl implements MemberService{
private MemberDao memberDao; private DataSourceTransactionManager txManager;
void doSomething(String name){
//プログラムチックなトランザクション管理 DefaultTransactionDefinition txDef = new DefaultTransactionDefinition();
txDef.setIsolationLevel(TransactionDefinition.ISOLATION_DEFAULT); TransactionStatus txStatus = this.txManager.getTransaction(txDef); try{ this.MemberDao.insert(); this.txManager.commit(txStatus); }catch(Exception e){ this.txManager.rollback(txStatus); } } }
【Spring設定ファイル(AppricationContext.xml)】
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans
"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
xmlns:aop ="http://www.springframework.org/schema/aop
"
xmlns:tx ="http://www.springframework.org/schema/tx
"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation=" http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
">
<!-- Data Source (例えばPostgres)--> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="org.postgresql.Driver"/> <property name="url" value="jdbc:postgresql://localhost/XXXX" /> <property name="username" value="XXX" /> <property name="password" value="XXX" /> </bean>
<!-- DAO --> <bean id="memberDao" class="dao.MemberDaoImpl"> <property name="dataSource" ref="dataSource" /> </bean> <!-- ビジネス --> <bean id="memberService" class="business.service.MemberServiceImpl"> <property name="transactionTemplateRequired" ref="transactionTemplateRequired" /> <property name="txManager" ref="transactionManager" /> </bean>
<!-- トランザクション管理 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
<!-- トランザクション処理用クラス。 --> <bean id="transactionTemplateRequired" class="org.springframework.transaction.support.TransactionTemplate"> <property name="transactionManager" ref="transactionManager" /> <property name="propagationBehaviorName" value="PROPAGATION_REQUIRED" /> </bean>
</beans>
【説明】
説明がなくても、なんとなく分かるかと思います。
他の宣言的トランザクションやアノテーションによるトランザクションでは、Springの設定ファイルやアノテーション内でトランザクションの方法を設定していました。
しかし、この方法ではプログラムの中でtxDefを使って設定しています。
再掲: txDef.setIsolationLevel(TransactionDefinition.ISOLATION_DEFAULT);
かなりプログラムっぽいですね。
そして、実際のトランザクション自体は、TransactionStatus を使用します。
普通にトランザクションのコードを書いているのと変わらない感じです。
いったい何の得があるのでしょうか?
これは、Springの宣言的トランザクションやアノテーションによるトランザクションと混ぜて使用できます。
例えば、上記のトランザクションの記述を通常のDataSourceを使用するようなやり方をすれば、Springの方法と合わないため、期待した動作が得られないかもしれません。
【使いどころ】
この方法の使いどころですが、かなりレアケースかと思います。
ほぼ、他のトランザクション管理の方法でまかなえるので、なるべくそちらを使いましょう。
ただ、かなり特化した独自のトランザクションをする場合は使用することになると思います。
プログラムによるトランザクション管理の1個目の方法は、特化しながら同じトランザクションの方法を提供するときにやりやすいと思います。
この方法は、もっと特化したやり方をする場合に使うことになるのかなと思います。
参照:
・トップ