본문 바로가기
Delvelopment/Spring

[Spring] 트랜잭션 설정 propagation (전파속성)

by 제제킴 2021. 3. 19.
반응형

@Transactional 종류 / propagation  전파속성

Spring framework 환경하에서 개발하다보면 필요한 Transaction에 대한 기본적인 설정들이다.

간혹 설정을 제대로 안해놔서 rollback이 되버리는 case도 존재하기도 했었다.

REQUIRED와 REQUIRES_NEW를 보통 사용했는데, 다른 격리수준도 확인차 정리한다.

 

 

  •  REQUIRED(기본값)
    • 부모 트랜잭션이 없다면 새로운 트랜잭션 생성.해당 메써드가 호출한 곳와 별도의 쓰레드라면 어떤 동작이 일어날까? 답은 전파 레벨과 상관 없이 무조건 별도의 트랜잭션을 생성하여 해당 메써드를 실행한다. Spirng은 내부적으로 트랜잭션 정보를 ThreadLocal 변수에 저장하기 때문에 다른 쓰레드로 트랜잭션이 전파되지 않는다
    • 중간에 롤백이 발생한다면 모두 하나의 트랜잭션이기 때문에 진행사항이 모두 롤백.
    • 부모 트랜잭션이 존재하다면 부모 트랜잭션으로 합류.
@Transactional(propagation = Propagation.REQUIRED)
public void transscationTest() { ... }
반응형
  •  REQUIRES_NEW
    • 각각의 트랜잭션이 롤백되더라도 서로 영향을 주지 않음.
    • 무조건 새로운 트랜잭션을 생성.
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void transscationTest() { ... }

 

  •  MANDATORY
    • 만약 부모 트랜잭션이 없다면 예외 발생.
    • 부모 트랜잭션에 합류.
@Transactional(propagation = Propagation.MANDATORY)
public void transscationTest() { ... }

 

  •  NESTED
    • 중첩된 트랜잭션 내부에서 롤백 발생시 해당 중첩 트랜잭션의 시작 지점까지만 롤백.부모 트랜재겻ㄴ이 존재하지 않는다면 새로운 트랜잭션을 생성.
    • 중첩 트랜잭션을 부모 트랜잭션이 커밋될 때 같이 커밋.
    • 부모 트랜잭션이 존재한다면 중첩 트랜잭션을 생성.
@Transactional(propagation = Propagation.NESTED)
public void transscationTest() { ... }

 

  •  NEVER
    • 트랜잭션이 존재한다면 예외 발생.
    • 트랜잭션을 생성하지 않음.
@Transactional(propagation = Propagation.NEVER)
public void transscationTest() { ... }

 

 

  •  SOPPORTS
    • 진행중인 부모 트랜잭션이 없다면 트랜잭션을 생성하지 않음.
    • 부모 트랜잭션이 있다면 합류
@Transactional(propagation = Propagation.SOPPORTS)
public void transscationTest() { ... }

 

  •  NOT_SUPPORTED
    • 진행중인 부모트랜잭션이 없다면 트랜잭션을 생성하지 않음.
    • 부모 트랜잭션이 있다면 보류.
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void transscationTest() { ... }

 

반응형

댓글