1. Transaction에서 rollback이 되지않는 경우는?
- checked exception은 트랜잭션에서 롤백되지않는다. (명시적인 예외처리가 필요한 것, try catch해야하는것 들)
- unchecked exception은 롤백대상 (예외처리를 하지 않아도 IDE에서 에러 뱉지 않음, Runtime Exception...)
2. checked exception 경우에도 rollback을 하고싶으면?
만약 B에서 에러가 발생했을때 A를 rollback시키고 싶다면? 이럴때 transaction을 이용한다
하지만 B의 exception이 checked exception이라면?
@Transactional
public void test() {
A();
B();
}
만약 아래처럼 try catch를 이용하면 에러를 catch에서 처리했기 때문에, rollback이 발생하지 않는다.
@Transactional
public void test() {
A();
try {
B(); // checked exception을 발생시키는 부분
} catch {
}
}
- @Transcational 어노테이션에 rollbackFor라는 옵션을 이용한다
해당 에러는 throw하고, rollbackFor옵션을 사용하면 checked exception도 확인할 수 있게 된다.
@Transactional(rollbackFor = {Exception.class})
public void test() {
A();
B(); // checked exception을 발생시키는 부분에서는 error throw
}
- checked 예외를 unchecked 예외로 변경하여 throw한다
public void B() {
try {
}catch(Exception e) {
throw new RuntimeException("예외");
}
}
@Transactional
public void test() {
A();
B(); // unchecked exception으로 바꿈
}
3. 아래와 같은 경우에는 롤백이 일어날까 일어나지 않을까?
// ATest 클래스
@Transactional
public void A() {
try {
test.B();
} catch (RuntimeException e) {
System.out.println("예외 처리");
}
}
// BTest클래스
@Transactional
public void B() {
//로직
mapper.save();
throw new RuntimeException("예외"); // unchecked exception
}
해당 코드는 다음과 같이 동작한다.
1. A클래스의 트랜잭션이 실행된다.
2. B메소드가 실행되면서 1번의 트랜잭션에 참여한다 (기본 propagation 속성이 PROPAGATION_REQUIRED)
3. save를 실행하는 부분의 처리가 끝나고 트랜잭션의 완료처리 (completion)을 진행함
4. checked Exception이 일어나면서 트랜잭션이 완료처리 됨
5. checked Exception때문에 해당 트랜잭션을 롤백 규칙을 적용(기본 규칙적용), 해당 메소드에서 바로 롤백하지않고 rollback mark를 함 (해당 마크는 전역으로 관리함)
6. A의 로직 수행 > 1번에서 생성된 트랜잭션의 완료처리가 진행, 이때 rollback mark를 확인해서 값이 true라면 rollback진행
따라서 이경우에는 롤백되어버린다
해당 propagation 옵션을 변경할경우 해당 rollback mark 문제를 해결할 수 있다
PROPAGATION_REQUIRES_NEW 사용시 매번 새로운 트랜잭션 생성
- A와 B가 각각 트랜잭션을 생성하고, 매 번 commit하므로 서로의 rollback에 영향을 미치지 않음
하지만 오버헤드 발생할 수 있음 (매번 새로운 커넥션 생성)
'프로그래밍 > SpringBoot' 카테고리의 다른 글
[spring security] csrf와 jwt의 관계 (0) | 2022.11.14 |
---|---|
[Spring boot 강의] #2 스프링부트 HTTPS / HTTP2적용하기 (0) | 2020.03.05 |
[Spring boot 강의] #1 Spring Boot 프로젝트 실행하기 (0) | 2020.02.27 |