본문 바로가기
WEB/spring

[Spring] @Transactional

by baam 2022. 6. 22.

TransactionalManager

같은 트랜잭션 내에서 같은 Connection을 사용할 수 있게 관리한다.

Spring에서 트랜잭션을 사용하는 방법은 첫 번째로 직접 TransactionManager를 사용하여 관리하는 방법이 있다.

public void insertA1WithTxManager() throws Exception{
    PlatformTransactionManager tm = new DataSourceTransactionManager(ds);
    TransactionStatus status = tm.getTransaction(new DefaultTransactionDefinition());//Tx의 속성을 정의

    try {
        a1Dao.insert(1, 100); //핵심기능
        a1Dao.insert(2, 200); //핵심기능
        tm.commit(status);  //Commit
    } catch (Exception e) {
        tm.rollback(status);  //Rollback
    }
}

 


두 번째로는 TransactionManager를 root-context.xml에 Bean으로 등록하고 @Transactional 어노테이션을 사용하는 방법이 있다. 어노테이션을 사용하면 AOP를 이용한 핵심 기능 코드와 트랜잭션의 코드를 분리할 수 있다.

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
   <property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven/><!-- 어노테이션 사용을 위해 입력 -->
@Transactional  //'@Transactional'만 적으면 RuntimeException, Error만 rollback
public void insertA1WithTxSuccess() throws Exception{
    a1Dao.insert(1, 100);
    a1Dao.insert(2, 200);
}

//Exception을 rollback
@Transactional(rollbackFor = Exception.class)
public void insertA1WithTxFail() throws Exception{
    a1Dao.insert(1, 100);
    a1Dao.insert(1, 200);
}

 


@Transactional의 속성

  • propagation : 트랜잭션의 경계를 설정하는 방법을 지정
  • isolation : 트랜잭션의 isolation level을 지정 (DEFAULT, READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
  • readOnly : 트랜잭션이 데이터를 읽기만 하는 경우, true로 지정하면 성능이 향상
  • rollbackFor : 지정된 예외가 발생하면, 트랜잭션을 rollback / RuntimeException과 Error는 자동 rollback
  • noRollbackFor : 지정된 예외가 발생해도, 트랜잭션을 rollback하지 않음
  • timeout : 지정된 시간(초) 내에 트랜잭션이 종료되지 않으면, 트랜잭션을 강제 종료

 

propagation 속성의 값

  • REQUIRED : 트랜잭션이 진행 중이면 참여하고, 없으면 새로운 트랜잭션 시작(디폴트)
  • REQUIRES_NEW : 트랜잭션이 진행 중이건 아니건, 새로운 트랜잭션 시작
  • NESTED : 트랜잭션이 진행 중이면, 트랜잭션의 내부 트랜잭션으로 실행
  • MANDATORY : 반드시 진행 중인 트랜잭션 내에서만 실행 가능. 아니면 예외 발생
  • SUPPORTS : 트랜잭션이 진행 중이건 아니건 상관없이 실행
  • NOT_SUPPORTED : 트랜잭션 없이 처리. 트랜잭션이 진행 중이면 잠시 중단(suspend)
  • NEVER : 트랜잭션없이 처리. 트랜잭션이 진행 중이면 예외 발생

댓글