■ 스프링의 트랜잭션 지원

  ● 스프링은 코드 기반의 트랜잭션 처리(Programmatic Transaction) 뿐만 아니라 선언적 트랜잭션(Declarative Transaction)을 지원하고 있다. 스프링이 제공하는 트랜잭션 템플릿 클래스를 이용하거나 설정 파일, 어노테이션을 이용해서 트랜잭션의 범위 및 규칙을 정의할 수 있다.

 

 

■ 선언적 트랜잭션 처리

  ● 선언적 트랜잭션은 설정 파일이나 어노테이션을 이용해서 트랜잭션의 범위, 롤백 규칙 등을 정의

  ● 다음과 같은 2가지 방식으로 정의

    ▶ <tx:advice> 태그를 이용한 트랜잭션 처리

    @Transactional 어노테이션을 이용한 트랜잭션 설정

 

 

◆ <tx:advice> 태그를 이용한 트랜잭션 처리

  ● tx 네임스페이스를 추가 후 다음과 같은 형태로 작성 

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

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

 

 <!-- 1. dataSource 생성 -->
 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName" value="oracle.jdbc.OracleDriver"></property>
  <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"></property>
  <property name="username" value="ADMIN"></property>
  <property name="password" value="GUEST"></property>
 </bean>


 <!-- transactionManager -->
 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"></property>
 </bean>

 

 <tx:advice id="txAdvice" transaction-manager="transactionManager">
  <tx:attributes>
   <tx:method name="aaa" propagation="REQUIRED"/>
   <tx:method name="bbb*" read-only="true" />
  </tx:attributes>
 </tx:advice> 

  ● <tx:advice> : 트랜잭션을 적용할 때 사용될 Advisor를 생성

    id 속성은 생성될 트랜잭션 Advisor의 식별 값, transaction-manager 속성에는 스프링의 PlatformTransactionManager 빈을 설정

    <tx:advice> 태그는 Advisor만 생성하는 것이지 실제로 트랜잭션을 적용하는 것이 아니므로 AOP를 통해서 설정해야 함(기본적으로 AOP를 알아야 함)

 

  ● <tx:method> : <tx:attributes> 태그의 자식 태그로 트랜잭션을 설정할 메서드 및 트랜잭션 속성을 설정

    <tx:method> 태그의 속성

속성 이름

설           명

 name

트랜잭션이 적용될 메서드 이름을 명시. '*' 사용 설정이 가능함

 propagation

트랜잭션의 전파 규칙을 설정

 isolation

트랜잭션의 격리 레벨을 설정

 read-only

읽기 전용 여부를 설정

 no-rollback-for

트랜잭션을 롤백하지 않을 예외 타입을 설정

 rollback-for

트랜잭션을 롤백할 예외 타입을 설정

 timeout

트랜잭션의 타임 아웃 시간을 초 단위로 설정

 

  ● <tx:method> 태그의 propagation 속성과 전파 규칙 - 트랜잭션의 전파 규칙을 정의

    <tx:method> 태그의 propagation 속성에 설정 가능한 값

속성 값

설      명

 REQUIRED

 (default)

메서드를 수행하는 데 트랜잭션이 필요하다는 것을 의미. 현재 진행 중인 트랜잭션이 존재하면, 해당 트랜잭션을 사용-존재하지 않는다면 새로운 트랜잭션을 생성

 MANDATORY

메서드를 수행하는 데 트랜잭션이 필요하다는 것을 의미. REQUIRED와 달리, 진행 중인 트랜잭션이 존재하지 않을 경우 예외를 발생

 REQUIRES_NEW

항상 새로운 트랜잭션을 시작. 기존 트랜잭션이 존재하면 기존 트랜잭션을 일시 중지하고 새로운 트랜잭션을 시작. 새로 시작된 트랜잭션이 종료된 뒤에 기존 트랜잭션이 계속됨

 SUPPORTS 메서드가 트랜잭션을 필요로 하지는 않지만, 기존 트랜잭션이 존재할 경우 트랜잭션을 사용한다는 것을 의미. 진행 중인 트랜잭션이 존재하지 않더라도 메서드는 정상적으로 동작
 NOT_SUPPORTED 메서드가 트랜잭션을 필요로 하지 않음을 의미. SUPPORTS와 달리 진행 중인 트랜잭션이 존재할 경우 메서드가 실행되는 동안 트랜잭션은 일시 중지되며, 메서드 실행이 종료된 후에 트랜잭션을 계속 진행
 NEVER 메서드가 트랜잭션을 필요로 하지 않으며, 만약 진행 중인 트랜잭션이 존재하면 예외를 발생
 NESTED

기존 트랜잭션이 존재하면, 기존 트랜잭션에 중첩된 트랜잭션에서 메서드를 실행. 기존 트랜잭션이 존재하지 않으면 REQUIRED와 동일하게 동작함. 이 기능은 JDBC 3.0 드라이버를 사용할 때에만 적용됨(JTA Provider가 이 기능을 지원할 경우에도 사용 가능함)

선언적 트랜잭션을 하는 경우 별도 처리가 필요하지 않다면 기본값인 "REQUIRED"를 트랜잭션 전파 규칙으로 사용

 

  ● <tx:method> 태그의 rollback-for 속성과 no-rollback-for 속성을 통한 롤백 처리

    rollback-for : 예외 발생시 롤백 작업을 수행할 예외 타입을 설정

    ▶ no-rollback-for : 예외가 발생하더라도 롤백 하지 않을 예외 타입을 설정

    ▶ 예외 타입이 한 개 이상인 경우 콤마로 구분

    ▶ 예외 클래스는 완전한 이름을 입력하거나, 패키지 이름을 제외한 클래스 이름만을 입력

<tx:method name="regist" rollback-for="Exception" no-rollback-for="MemberNotFoundException"/> 

Exception 및 하위 타입의 예외가 발생할 경우 롤백 작업을 수행하고, MemberNotFoundException이 발생하는 경우에는 롤백 작업을 수행하지 않음.

스프링은 예외 발생시 좀더 정확하게 매칭되는 타입을 기준으로 롤백 규칙을 적용하기 때문에 MemberNotFoundException이 Exception 클래스를 상속 받았다고 하더라도 MemberNotFoundException이 발생하면 롤백을 수행하지 않게 됨

 

  ● <tx:method> 태그의 isolation 속성과 트랜잭션 격리 레벨

    isolation 속성에 설정 가능한 값

속성 값

설        명

 DEFAULT

기본 설정을 사용

 READ_UNCOMMITTED

다른 트랜잭션에서 커밋하지 않은 데이터를 읽을 수 있음

 READ_COMMITTED 다른 트랜잭션에서 의해 커밋된 데이터를 읽을 수 있음
 REPEATABLE_READ 처음에 읽어 온 데이터와 두 번째 읽어 온 데이터가 동일한 값을 갖는다

 SERIALIZABLE

동일한 데이터에 대해서 동시에 두 개 이상의 트랜잭션이 수행될 수 없다

 

 

 

 

[참고자료] Spring 3.0 프로그래밍-최범균

+ Recent posts