Spring Transaction

박용민·2024년 1월 19일

EntityManager

  • JPA에서 DB와 상호 작용을 담당하며 객체를 저장, 조회 ,갱신, 삭제 등의 작업을 수행
  • EntityManagerFactory로 부터 생성되며 트랜잭션 및 영속성 컨텍스를 통해 Entity를 관리
  • persist, merge, remove 등의 메소드를 사용하여 엔터티의 상태를 변경하고 DB에 반영

@PersistenceContext

  • EntityManager를 주입받기 위한 어노테이션
  • 스프링 빈으로 등록 및 DI(Dependency Injection)가능

@Transactional

  • 스프링에서 선언적 트랜잭션 관리를 제공하는 어노테이션
  • 어노테이션을 메소드에 추가하면 해당 메소드는 트랜잭션 내에서 실행
  • 메소드가 정상적으로 완료되면 트랜잭션이 커밋
  • 예외 발생시 트랜잭션 롤백
  • 격리 수준, 읽기 전용등 옵션 적용 가능

save 메소드에 @Transactional이 상용되어 readOnly = false로 적용

트랜잭션 전파(Transaction Propagation)

  • 여러 트랜잭션을 사용하는 메소드 간의 트랜잭션 동작 방식을 설정
  • propagation 속성을 통해 트랜잭션 전파 옵션을 설정
  • REQUIRED(default) : 현재 실행 중인 트랜잭션이 있으면 그 트랜잭션에 참여하고(자식) 없으면 새로운 트랜잭션을 시작(부모)
  • REQUIRES_NEW : 항상 새로운 트랜잭션을 시작, 현재 실행 중인 트랜잭션이 잇으면 일시 중지
  • MANDATORY : 현재 실행 중인 트랜잭션이 있으면 그 트랜잭션에 참여하고, 없으면 예외를 던짐
  • NESTED : 현재 실행 중인 트랜잭션이 있으면 중첩 트랜잭션을 시작하고, 없으면 새로운 트랜잭션을 시작 및 중첩 트랜잭션은 부모 트랜잭션에 커밋 또는 롤백
  • SUPPORTS : 현재 실행 중인 트랜잭션이 있으면 그 트랜잭션에 참여하고, 없으면 트랜잭션 없이 메소드를 실행
  • NOT_SUPPORTED : 현재 실행 중인 트랜잭션이 있으면 일시 중지시키고, 트랜잭션 없이 메소드를 실행
  • NEVER : 현재 실행 중인 트랜잭션이 있으면 예외를 던지고, 없으면 트랜잭션 없이 메소드를 실행

[참고자료]

0개의 댓글