アノテーションによるトランザクション管理 | Java Springの逆引きメモ

Java Springの逆引きメモ

JavaのSpring frameworkのメモを書いていきます!
初心者の勉強ノートなので間違いがあるかもしれませんが、何かヒントになることがあれば幸いです。

前の記事 で見たアノテーションによるトランザクションを見ていきます。


例によって、サンプルをメインにしてみて行こうと思います。




【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">
</bean>


<!-- トランザクション管理 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>


<!-- トランザクションのアノテーションを有効にする -->

<tx:annotation-driven />


</beans>




<ビジネスロジック(アノテーションのサンプルその)>

@Transactional(readOnly=true)

public class MemberServiceImpl{


 public find(Member member){

   

 }


 @Transactional(readOnly=false, rollbackFor=RuntimeException.class)

 public update(Member member){

   

 }

//・・・様々なメソッド

}





【説明】

クラスの先頭でクラス内のメソッドすべてにreadOnlyを設定しています。

そして、さらに、メソッド毎にも@Transactional を設定できています。


アノテーションは、オーバーライドができるようです。


この事情は、クラスを派生させたときにも同じようです。



さて、ほんとんど説明することはないかと思います。

指定したクラス、またはメソッド毎にトランザクションを指定できます。


宣言的トランザクションがアプリケーション全体を相手にしているのに対して、

アノテーションは1つのクラス、1つのメソッドを相手にする感じですかね。


上記では、updateメソッドだけ、書き込みOKになっています。



<アノテーションを有効にする方法>

実は@Transactional をコードに記述すればトランザクションが行われるわけではありません。

Springの設定ファイルに以下の記述をする必要があります。


① <tx:annotation-driven />


② beanのtransactionManagerを記述する。


これだけです!音譜


 上記①のタグの属性はAOPの設定とほぼ同じです。

 基本的にはinterfaceについてのみアノテーションが適用されます。

 classについても適用したい場合は、proxy-target-class="true"に設定してください。

 詳しくは、・DIxAOPの機能について 参照。



【設定について】

実は、内容は宣言的トランザクションと同じです

ですので、宣言的トランザクションのタグとアノテーションの対応さえを分かればすぐ使えると思います。

こちらの記事 の一覧表とあわせてみていただければ分かるかと思います。



<宣言的トランザクションとの対応表>

tx:methodのタグ属性 @Transactionalでの名称 アノテーションの備考
propagation propagation Propagation.REQUIREDのように列挙型を設定する
isolation isolation Isolation.DEFAULTのように列挙型を設定する
read-only readOnly true/false
rollback-for rollbackFor RuntimeException.classのようにクラスを設定する。
no-rollback-for noRollbackFor 同上
timeout timeout






宣言的トランザクションとアノテーションのトランザクションは同じなので、どちらかを覚えればすぐ使用できるかと思います!



参照:

トップ

・Springのトランザクション機能について

Transactionalアノテーションの例