Spring Framework - @Transactional 두번째

h.Im·2024년 8월 29일

Springboot 기초

목록 보기
9/17
post-thumbnail

TransactionInterceptor와 TransactionManager

TransactionInterceptor

TransactionInterceptor는 AOP 어드바이스로, 트랜잭션 시작, 커밋, 롤백 등의 트랜잭션 관리 작업을 처리합니다. 이 인터셉터는 MethodInvocation을 가로채고, 트랜잭션의 시작과 종료를 관리하는 책임을 집니다.

TransactionManager

TransactionManager는 트랜잭션을 관리하는 핵심 컴포넌트입니다. TransactionManager가 트랜잭션 begin, commit, rollback 등 트랜잭션 상태 관리를 수행합니다.


트랜잭션 전파(Propagation)

Transactional은 트랜잭션의 전파 방식과 격리 수준을 제어할 수도 있습니다. 자세한 활용 내용은 나중에 알아보도록 하고, 개념만 알아보고 넘어가겠습니다.

트랜잭션 전파

어떤 트랜잭션이 동작중일 때, 다른 트랜잭션을 실행할 경우 트랜잭션을 어떻게 처리해야 하는가에 대한 개념

velog에 새 글을 작성할 때, 임시 저장 기능이 주기적으로 동작합니다. 이때, 내부적으로 로깅 기능이 동작하는데, 로깅에서 문제가 발생한다고 해서 임시 저장 기능까지 롤백되는 것은 올바른 동작이 아닐 것입니다.
그럼 어떻게 각 트랜잭션을 다루어 주어야 할까요? 트랜잭션 전파 속성 종류를 알아보겠습니다.

REQUIRED

  • 디폴트
  • 부모 트랜잭션이 있으면 부모 트랜잭션에 종속
  • 부모 트랜잭션이 없을 경우에는 새로운 트랜잭션 생성

    부모 트랜잭션이란? 하나의 트랜잭션이 진행 중인 상태에서, 다른 트랜잭션을 요구하는 메서드가 호출되면, 기존의 트랜잭션을 부모 트랜잭션이라고 부를 수 있습니다.

REQUIRES_NEW

  • 부모 트랜잭션을 무시하고 무조건 새로운 트랜잭션 생성
  • 부모 트랜잭션은 현재 트랜잭션이 종료될 때까지 대기상태로 존재
  • 자기 트랜잭션에서 예외가 발생해 Rollback이 진행되도 부모 트랜잭션에 Rollback이 전파되지 않음
  • 부모 트랜잭션에서 예외가 발생해 Rollback이 진행되도 자기 트랜잭션에 전파되지 않음

SUPPORTS

  • 부모 트랜잭션이 있을 때만 해당 부모 트랜잭션에 종속
  • 부모 트랜잭션이 없으면 트랜잭션이 적용되지 않음

NOT_SUPPORTED

  • 부모 트랜잭션이 있으면 부모 트랜잭션을 대기시키고 트랜잭션 없이 실행
  • 부모 트랜잭션이 없으면 트랜잭션 없이 실행됨

MANDATORY

  • 부모 트랜잭션이 있을 때만 해당 부모 트랜잭션에 종속
  • 부모 트랜잭션이 없으면 예외 발생

NEVER

  • 트랜잭션이 적용되면 안되는 경우에 사용
  • 부모 트랜잭션이 있으면 예외 발생
  • 부모 트랜잭션이 없으면 트랜잭션 없이 실행

NESTED

  • 부모 트랜잭션이 있으면 새로운 트랜잭션 생성
  • REQUIRED_NEW와는 다름
  • 부모 트랜잭션의 커밋과 롤백에는 영향을 받지만 자신의 커밋과 롤백은 부모 트랜잭션에게 영향을 주지 않음
  • 자식 트랜잭션이 실패하면 부모 트랜잭션은 Rollback되지 않는다
  • 부모 트랜잭션이 실패하면 자식 트랜잭션은 Rollback된다

0개의 댓글