티스토리 뷰

Developer

[Transaction] DB Transaction 설정

rocksea 2013. 1. 31. 14:46

프로젝트를 진행하던중 서비스에서 Exception발생시 해당서비스에서 발생시킨 모든 DB Transaction에대해 rollback 을 처리해야하는 경우가 생겨 알아보았습니다.


Annotation기반 DB Transaction을 처리하기.


step1. db transaction 설정

annotation 기반의 transaction처리를 위한 Transaction Manager를  설정합니다. 

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:p="http://www.springframework.org/schema/p"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:aop="http://www.springframework.org/schema/aop"

    xmlns:jee="http://www.springframework.org/schema/jee"

    xmlns:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

        http://www.springframework.org/schema/aop

        http://www.springframework.org/schema/aop/spring-aop.xsd

        http://www.springframework.org/schema/tx

        http://www.springframework.org/schema/tx/spring-tx.xsd

  http://www.springframework.org/schema/jee

  http://www.springframework.org/schema/jee/spring-jee.xsd">

  

<bean id="mssqlDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

<property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />

<property name="url" value="jdbc:sqlserver://xxx.xxx.xxx.xxx;DatabaseName=XXXX" />

<property name="username" value="rocksea" />

<property name="password" value="xxxxxx" />

<property name="defaultAutoCommit" value="false"/>

<property name="initialSize" value="10"/>

<property name="maxActive" value="20"/>

<property name="maxIdle" value="10"/>

<property name="maxWait" value="20000"/>

<property name="logAbandoned" value="true"/>

<property name="removeAbandoned" value="true"/>

<property name="removeAbandonedTimeout" value="60"/>

<property name="validationQuery" value="SELECT 1" />

<property name="testOnBorrow" value="true" />

<property name="testOnReturn" value="true" />

</bean>

 

 

<bean id="mssqlTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource" ref="mssqlDataSource"></property>

</bean>


<!-- mssql data source -->

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

        <property name="dataSource" ref="mssqlDataSource" />

        <property name="configLocation" value="classpath:db/mybatis-config.xml" />

        <property name="mapperLocations" value="classpath:db/sql/mssql/**/*.xml" />

    </bean>

  <bean id="sqlSessionForMssql" class="org.mybatis.spring.SqlSessionTemplate">

  <constructor-arg index="0" ref="sqlSessionFactory" />

  </bean>

  <aop:aspectj-autoproxy/>

  <tx:annotation-driven transaction-manager="mssqlTransactionManager"/>

</beans>


step2. service transaction 적용

@Service

public class TestService{

@Transactional(rollbackFor={Exception.class, DataIntegrityViolationException.class})

public String testTransaction() throws DataIntegrityViolationException, Exception{

.

.

}

}


 속성

 필수여부

디폴트 

 상세설명

name 

yes 

 

 랜잭션 속성을 가지는 메소드 이름이 결합되었다. 와일드카드(*)문자는 많은 수의 메소드를 가지고 같은 트랜잭션 속성 셋팅을 결합시키기 위해 사용될수 있다. 예를 들어, 'get*''handle*', 'on*Event', 등등.

propagation

 no

 required

 트랜잭션 위임행위

isolation 

 no

 default

 트랜잭션 격리 레벨

timeout

 no

 -1

 트랜잭션 타임아웃값(초단위)

read-only 

 no

 false

 이 트랜잭션이 읽기전용인가.?

rollback-for 

 no

 

 롤백을 야기할 콤마로 구분되는 Exception(s). 예를 들어, 'com.foo.MyBusinessException,ServletException'

no-rollback-for 

 no

 

 롤백을 야기하지 않는 콤마로 구분되는 Exception(s). 예를 들어, 'com.foo.MyBusinessException,ServletException'


일단 Exception Throw할때 모든 서비스 transaction을 rollback 하는 예제를 적용해 보았습니다.

위 속성을 참고해서 Transaction을 상황에 맞게 적용하시면 됩니다.


by rocksea.






댓글