Transaction Propagation
Spring Transaction의 Propagation(전파 범위)에 대해서 알아보자.
트랜잭션 전파 범위는 트랜잭션을 시작하거나 기존 트랜잭션에 참여하는 방법과 롤백되는 범위 등에 대한 속성값이다.
종류는 다음의 7가지가 있다.
- REQUIRED(default)
- REQUIRES_NEW
- MANDATORY
- SUPPORTS
- NESTED
- NEVER
REQUIRED
default 속성이다.
Required는 부모 트랜잭션이 존재한다면 부모 트랜잭션에 합류한다. 그렇지 않다면 새로운 트랜잭션을 만든다.
중간에 자식 / 부모에서 예외가 발생한다면 자식과 부모 모두 rollback 한다.
REQUIRES_NEW
무조건 새로운 트랜잭션을 만든다.
nested한 방식으로 메소드 호출이 이루어지더라도 rollback은 각각 이루어 진다.
MANDATORY
무조건 부모 트랜잭션에 합류시킨다.
부모 트랜잭션이 존재하지 않는다면 예외를 발생시킨다.
SUPPORTS
메소드가 트랜잭션을 필요로 하지는 않지만, 진행 중인 트랜잭션이 존재하면 트랜잭션을 사용한다.
진행 중인 트랜잭션이 존재하지 않으면 트랜잭션이 적용되지 않은 채로 메소드가 정상 동작한다.
NESTED
부모 트랜잭션이 존재하면 부모 트랜잭션에 중첩시키고, 부모 트랜잭션이 존재하지 않으면 새로운 트랜잭션을 생성한다.
부모 트랜잭션에 예외가 발생하면 자식 트랜잭션도 rollback한다.
여기까지는 Required와 동일하다.
하지만 자식 트랜잭션에 예외가 발생하더라도 부모 트랜잭션은 rollback하지 않는다.
NEVER
메소드가 트랜잭션을 필요로 하지 않는다. 만약 진행 중인 트랜잭션이 존재하면 예외가 발생한다.
참고
'Server > Spring JPA' 카테고리의 다른 글
Spring - @Transactional(readOnly = true)을 하면 일어나는 일 (0) | 2022.11.04 |
---|---|
Spring - Service Layer에서 Storage를 다룰 때 트랜잭션 처리하기! (커넥션, 락 과점유 피하기!) (0) | 2022.10.25 |
JPA - Update(수정) 시 save() 메서드를 호출하는 것이 좋을까? (2) | 2022.09.15 |
Spring - JpaRepository가 아닌 Repository를 사용해야 하는 이유! (1) | 2022.07.18 |
Spring Boot - 커넥션 풀 상태 확인하기! (0) | 2022.06.11 |