개발서적/토비 스프링 3.1-Vol.1

[토비의 스프링 - Vol.1] 6.6 트랜잭션 속성

 

1. 트랜잭션 전파

  • PROPAGATION_REQUIRED
    • 가장많이 사용되는 트랜잭션 전파 속성
    • 진행 중인 트랜잭션이 없으면 새로 시작, 이미 시작된 트랜잭션이 있으면 이에 참여
  • PROPAGATION_REQUIRES_NEW
    • 항상 새로운 트랜잭션을 시작한다.
    • 독립적인 트랜잭션이 보장돼야 하는 코드에 적용
  • PROPAGATION_NOT_SUPPORTED
    • 트랜잭션 없이 동작하도록 만든다.
    • 모든 메소드에 AOP 적용 후 특정 메소드에는 AOP를 적용하고 싶지 않을 경우 많이 사용한다.

2. 격리 수준 

  • 서버환경에서 여러개 트랜잭션이 진행 될 때, 작업에 대한 격리 수준 
  • DefaultTransactionDefinition에 설정된 격리수준은 ISOLATION_DEFAULT
  •  ISOLATION_DEFAULT는 DataSource에 디폴트 격리수준을 따르는 설정

3. 제한시간

  • 트랜잭션을 수행하는 제한시간을 설정
  • DefaultTransactionDefinition의 기본 설정은 제한시간이 없다.
  • 트랜잭션을 직접 시작할 수 있는 PROPAGATION_REQUIRED, PROPAGATION_REQIRES_NEW를 써야 의미가 있음  

 

4. 읽기전용

  • 트랜잭션 내에서 데이터를 조작하는 시도를 막아준다. 
  • 데이터 엑세스 기술에 따라 성능이 향상될 수 있다.

 

TransactionInterceptor

  • PlatformTransactionManager와 Properties 타입의 두가지 프로퍼티를 갖음
  • Properties 타입인 프로퍼티 이름은 transactionAttributes이며,
    TransactionDefinition의 네가지 항목 + rollbackOn() 를 갖고 있는 TrasactionAttribute 인터페이스로 정의
  • rollbackOn()을 활용하면 특정 체크 예외의 경우 트랜잭션을 롤백시킬 수 있음,
    특정 런타임 예외에 대해서 트랜잭션 커밋시킬 수도 있음
  • Properties 타입의 transactionAttributes 프로퍼티는 메소드 패턴과 트랜잭션 속성을 키와 값으로 갖는 컬렉션
    1. PROPAGATION_NAME: 트랜잭션 전파 방식, PROPAGATION_으로 시작한다. (필수)
    2. ISOLATION_NAME: 격리수준, ISOLATION_으로 시작한다. (생략가능, 디폴트: 격리수준)
    3. readOnly: 읽기전용 항목 (생략가능, 디폴트:읽기전용)
    4. timeout_NNNN: 제한시간, timeout_으로 시작하고 초 단위 시간을 뒤에 붙인다. (생략가능)
    5. -Exception1: 체크 예외중 롤백 대상으로 추가할 것을 넣는다 (한개 이상 가능)
    6. +Exception1: 런타임 예외지만 롤백시키지 않을 예외를 넣는다 (한개 이상 가능)
<bean id="transactionAdvice" class="org.springframework.transaction.interceptor.TransactionInterceptor">
        <property name="transactionManager" ref="transactionManager"/>
        <property name="transactionAttributes">
            <props>
                <prop key="get*">PROPAGATION_REQUIRED,readOnly,timeout_30</prop>
                <prop key="upgrade*">PROPAGATION_REQUIRES_NEW,ISOLATION_SERIALIZABLE</prop>
                <prop key="*">PROPAGATION_REQUIRED</prop>
            </props>
        </property>
    </bean>
      - upgrade로 시작하는 메소드는 항상 독립적인 트랜잭션으로 동작 (PROPAGATION_REQUIRES_NEW)

 

      완벽하게 고립된 상태에서 동작하도록 격리 수준을 최고 수준인 ISOLATION_SERIALIZABLE로 설정
    - *만 사용해서 위에 두가지 조건에 해당하지 않는 나머지 모든 메소드에 사용될 속성을 지정