1. @Transactional로 Transaction 적용하기
DAO 에서는 connection 얻을 때 아래와 같이 수정 필요
AOP를 이용해서 핵심 기능과 부가 기능을 분리한다. 원래는 아래와 같은 코드를
@Transactional 애노테이션을 붙이고, 이렇게 핵심 로직만 남기고 분리할 수 있다.
@Transactional(rollbackFor = Exception.class) // Exception만 Rollback
@Transactional // RuntimeException, Error만 rooback
참고로 @Transactional은 클래스나 인터페이스에도 붙일 수 있다. 그러면 해당 클래스/인터페이스 내의 모든 메서드에 적용된다.
2. @Transactional의 속성
속성 | 설명 |
propagation | Tx의 경계를 설정하는 방법을 지정 |
isolation | Tx의 isolation level을 지정. DEFAULT, READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE |
readOnly | Tx이 데이터를 읽기만 하는 경우, true로 지정하면 성능이 향상 |
rollbackFor | 지정된 예외가 발생하면, Tx을 rollback ( RuntimeException과 Error는 자동 rollback ) |
noRollbackFor | 지정된 예외가 발생해도 Tx을 rollback하지 않음 |
timeout | 지정된 시간 내에 Tx이 종료되지 않으면 Tx를 강제 종료 |
3. Propagation 속성의 값
값 | 설명 |
REQUIRED | Tx이 진행중이면 참여하고, 없으면 새로운 Tx 시작 (디폴트) |
REQUIRES_NEW | Tx이 진행 중이건 아니건, 새로 Tx 시작 (Tx 안에 다른 Tx를 만듦) |
NESTED | Tx이 진행 중이면, Tx의 내부 Tx로 실행 (Tx 안에 sub Tx를 만듦) |
MANDATORY | 반드시 진행 중인 Tx내에서만 실행 가능 |
SUPPORTS | Tx이 진행 중이건 아니건 상관없이 실행 |
NOT_SUPPORTED | Tx 없이 처리. Tx이 진행 중이면 잠시 중단(suspend) |
NEVER | Tx 없이 처리. Tx이 진행 중이면 예외 발생 |
1) REQUIRED
아래 코드를 보면 insertA1WithTx 가 insertB1WithTx를 호출하고 있다.
@Transactional (propagation = Propagation.REQUIRED)
public void insertAlWithTx() throws Exception {
a1Dao.insert(1,100);
insertB1WithTx();
alDao. insert(1,200);
}
@Transactional (propagation = Propagation.REQUIRED)
public void insertB1WithTx() throws Exception {
b1Dao.insert(1,100);
b1Dao.insert(1,200);
}
propagation에 REQUIRED 값을 줄 경우 기존에 Tx가 있으면새로 Tx를 만들지 않는다. 즉 두 개의 Tx가 마치 하나의 Tx처럼 실행된다.
2) REQUIRES_NEW
호출되는 메서드의 propagation 값이 REQUIRES_NEW이다.
@Transactional(propagation = Propagation.REQUIRED)
public void insertAlWithTx () throws Exception {
alDao.insert(1,100);
insertB1WithTx();
a1Dao.insert(1,200);
}
@Transactional (propagation = Propagation.REQUIRES_NEW)
public void insertB1WithTx() throws Exception {
b1Dao.insert(1,100);
b1Dao.insert(1,200);
}
이 경우는 기존 Tx 여부와 상관없이 새로 Tx를 시작한다. 즉 2개의 Tx가 발생한다.
만약 여기서 A2 과정에서 에러가 발생하면, Tx2는 commit된 상태이므로 rollback되지 않고 Tx1(즉 A1,A2)만 rollback 된다.
참조
https://fastcampus.co.kr/dev_academy_nks
'3. Back-end > 3-2. Spring MVC - 남궁성' 카테고리의 다른 글
SpringMVC - [ MyBatis 동적 쿼리 ] (0) | 2023.04.04 |
---|---|
SpringMVC - [ MyBatis ] (0) | 2023.03.26 |
Spring MVC - [ AOP ] (0) | 2023.03.09 |
Spring MVC - [ Transaction, commit, Rollback ] (0) | 2023.03.03 |
Spring MVC - [ Spring DI ] (0) | 2023.02.08 |