본문 바로가기
Spring

Spring Transaction rollback @Annotation 처리 (선언적 트랜잭션 처리) - 작성중..

by 아이티.파머 2012. 1. 17.
반응형
transaction rollback 누구나가 programming 을 하다보면 트랜잭션 처리에 대해 생각을 하게 된다.
물론 학부시절에는 롤백보다는 일단 life cycle 을 익히고 실행/동작하는것에 focus가 맞춰있다보니 이젠 이런 내용들을 .....



선언적 트랜잭션
특징 : 1. Transaction Template과 달리 트랜잭션 처리를 코드에서 수행하지 않음.
         2. 설정 파일이나 어노테이션을 이용해서 트랜잭션의 범위, 롤백의 규칙을 정의

방법 :
        1.<tx:advice> 태그를 이용한 트랜잭션 처리
        2.TransactionProxyFactoryBean Class를 이용한 트랜잭션 처리 
        3. @Transaction  어노테이션을 이용한 처리.


여기서 소개할 트랜잭션 처리 방식은 2.TransactionProxyFactoryBean과 3.@Transaction 을 이용한 두가지 방법이다.  

 
1. 먼저 TransactionProxyFactoryBean 을 이용한 트랜잭션 처리

<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">

<property name="configLocations">

<list>

<value>classpath:ibatis/sql-map-config.xml</value>

</list>

</property>

<property name="useTransactionAwareDataSource">

<value>true</value>

</property>

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

</bean>


<!-- Transaction manager for a single JDBC DataSource -->

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

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

</bean>

<bean id="abstractTxDefinition" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">

<property name="transactionManager" ref="transactionManager" />

<property name="transactionAttributes">

<props>

<prop key="update*">PROPAGATION_REQUIRED</prop>

<prop key="delete*">PROPAGATION_REQUIRED</prop>

<prop key="insert*">PROPAGATION_REQUIRED</prop>

<prop key="add*">PROPAGATION_REQUIRED</prop>

<prop key="remove*">PROPAGATION_REQUIRED</prop>

<prop key="clear*">PROPAGATION_REQUIRED</prop>

<prop key="rename*">PROPAGATION_REQUIRED</prop>

<prop key="move*">PROPAGATION_REQUIRED</prop>

<prop key="import*">PROPAGATION_REQUIRED</prop>

<prop key="set*">PROPAGATION_REQUIRED</prop>

<prop key="create*">PROPAGATION_REQUIRED</prop>

<prop key="store*">PROPAGATION_REQUIRED</prop>

<prop key="import*">PROPAGATION_REQUIRED</prop>

<prop key="request*">PROPAGATION_REQUIRED</prop>

<prop key="approve*">PROPAGATION_REQUIRED</prop>

<prop key="start*">PROPAGATION_REQUIRED</prop>

<prop key="execute*">PROPAGATION_REQUIRED</prop>

<prop key="*confirm*">PROPAGATION_REQUIRED</prop>

<prop key="*report*">PROPAGATION_REQUIRED</prop>

<prop key="*save*">PROPAGATION_REQUIRED</prop>

<prop key="redraft*">PROPAGATION_REQUIRED</prop>

<prop key="report*">PROPAGATION_REQUIRED</prop>

<prop key="apporove*">PROPAGATION_REQUIRED</prop>

<prop key="reject*">PROPAGATION_REQUIRED</prop>

<prop key="redraft*">PROPAGATION_REQUIRED</prop>

<prop key="accept*">PROPAGATION_REQUIRED</prop>

<prop key="copy*">PROPAGATION_REQUIRED</prop>

<prop key="get*">PROPAGATION_REQUIRED</prop>

<prop key="eval*">PROPAGATION_REQUIRED</prop>

<prop key="multi*">PROPAGATION_REQUIRED</prop>

<prop key="handle*">PROPAGATION_REQUIRED</prop>

<prop key="*">PROPAGATION_SUPPORTS, readOnly</prop>

</props>

</property>

</bean>


<!-- DataSource  -->

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

<property name="driverClassName" value="${jdbc.driverClassName}" />

<!-- <property name="driverClassName" value="com.p6spy.engine.spy.P6spyDriver" /> -->

<property name="url" value="${jdbc.url}" />

<property name="username" value="${jdbc.username}" />

<property name="password" value="${jdbc.password}" />

</bean>


1.1  TransactionProxyFactoryBean 
트랜잭션을 처리해주는 프록시를 생성해주는 클래스
1.2 프로퍼티
*target
-트랜잭션을 적용할 대상 객체를 설정.
*transactionManager
-트랜잭션 관리자 설정
*transactionAttributes
-트랜잭션 속성 설정에 사용되는 Properties 객체 설정.
*<prop> key & 형식

PROPAGATION_NAME, ISOLATION_NAME,readOnly,timeout,+Exception1,-Exception2


PROPAGATION_NAME : 
- 필수항목
- PROPAGATION_REQUEST와 같은 트랜잭션 전파 규칙이 위치한다.
ISOLATION_NAME :
- ISOLATION_DEFAULT 와 같은 트랜잭션 결리 레벨이 위치.
readOnly :
- 트랜잭션을 읽기 전용으로 설정
timeout :
- 트랜잭션의 타임 아웃 시간을 초 단위로 설정
롤백규칙 :
- '+' , '-'를 이용하여 설정
- 예외클레스 이름앞에 '+'를 붙이면 해당 예외가 발생하더라도 커밋을 수행.
- '-'를 붙이면 롤백을 수행.




2. @Transactional 을 이용한 처리 방법
-2.5 ver. 에서 사용가능하며 메서드나 클래스에 적용하여 사용한다.
Class 사용예제

@Transactional
public class TestServiceImpl implements ITestService{


Method 사용예제


 
 


반응형