[JPA 기본] Transaction Manager
포스트
취소

[JPA 기본] Transaction Manager

트랜잭션 매니저란?

  • 스프링에서 제공하는 트랜잭션 처리를 위한 추상화 클래스
  • 트랜잭션 관리는 서비스 클래스에서 진행하는 것을 권장한다.
  • 예외 발생가 발생하게 되면 예외가 발생하기 전까지 진행했던 DB 처리 작업들을 모두 롤백시킨다. (DAO 메소드)
  • 트랜잭션 관리가 필요한 쿼리의 종류는 INSERT, UPDATE, DELETE 총 3가지이다.
  • Spring에서는 일관적인 트랜잭션 관리를 위해서 spring-tx 클래스를 제공한다.

사용방법

  • @Transactional 어노테이션을 사용한다.
    • org.springframework.transaction.annotation.Transactional
  • 메소드, 클래스, 인터페이스 위에 추가하여 사용하다.
    • 선언적 트랜잭션
  • @Transactional 어노테이션이 적용된 범위에서는
    트랜잭션 기능이 포함된 프록시 객체가 생성되어
    자동으로 commit/rollback을 진행한다.
  • 사용 예시
    @Service
    @RequiredArgsConstructor
    public class MemberService {
        private final MemberRepository memberRepository;

        @Transactional(propagation =  Propagation.NESTED)
        public void putMember() {
            Member member = new Member();
            member.setName("HongGilDong");
            member.setPhoneNumber("010-1234-1234");
            member.setGender("M");

            memberRepository.save(member);
        }
    }
    

@Transactional의 옵션

  • isolation
    • 트랜잭션에서 일관성없는 데이터 허용 수준을 설정한다.
    • 종류
      • DEFAULT (기본값) : DB의 lsolation Level을 따른다.
      • READ_UNCOMMITED (level 0) : 커밋되지 않는 데이터에 대한 읽기를 허용한다.
      • READ_COMMITED (level 1) : 커밋된 데이터에 대해 읽기를 허용한다.
      • REPEATEABLE_READ (level 2) : 동일 필드에 대해 다중 접근 시 모두 동일한 결과를 보장한다.
      • SERIALIZABLE (level 3) : 가장 높은 격리, 성능 저하의 우려가 있음
      • 사용법 예시
            @Transactional(isolation =  Isolation.READ_COMMITED)
            
  • propagation
    • 트랜잭션 동작 도중 다른 트랜잭션을 호출할 때, 어떻게 할 것인지 지정하는 옵션이다.
    • 종류
      • REQUIRED
        • 기본값
        • (A) 이미 진행중인 트랜잭션이 있다면 해당 트랜잭션 속성을 따른다.
        • (B) 진행중이 아니라면 새로운 트랜잭션을 생성한다.
      • REQUIRES_NEW
        • (A) 항상 새로운 트랜잭션을 생성한다.
        • (B) 이미 진행중인 트랜잭션이 있다면 잠깐 보류하고 해당 트랜잭션 작업을 먼저 진행한다.
      • SUPPORT
        • (A) 이미 진행 중인 트랜잭션이 있다면 해당 트랜잭션 속성을 따른다.
        • (B) 진행 중인 트랜잭션이 없다면 트랜잭션을 설정하지 않는다.
      • NOT_SUPPORT
        • 이미 진행중인 트랜잭션이 있다면 보류하고, 트랜잭션 없이 작업을 수행한다.
      • MANDATORY
        • (A) 이미 진행 중인 트랜잭션이 있어야만 작업을 수행한다.
        • (B) 진행 중인 트랜잭션이 없다면 Exception을 발생시킨다.
      • NEVER
        • (A) 트랜잭션이 진행중이지 않을 때 작업을 수행한다.
        • (B) 진행중인 트랜잭션이 있다면 Exception을 발생시킨다.
      • NESTED
        • (A) 진행중인 트랜잭션이 있으면 중첩된 트랜잭션이 실행된다.
        • (B) 진행중인 트랜잭션이 없으면 REQUIRED와 동일하게 실행된다.
      • 사용법 예시
        @Transactional(propagation =  Propagation.NESTED)
        
  • noRollbackFor
    • 특정 예외 발생 시 rollback하지 않는다.
    • 사용법 예시
        @Transactional(noRollbackFor=Exception.class)
        
  • rollbackFor
    • 특정 예외 발생 시 rollback한다.
    • @Transactional 어노테이션은 기본적으로 Unchecked Exception, Error 만을 rollback한다.
      • 모든 예외에 대해서 롤백시키기 위해서는 모든 예외의 기본 클래스인 Exception 클래스를 옵션으로 설정한다.
    • 사용법 예시
        @Transactional(rollbackFor=Exception.class)
        
  • timeout
    • 지정한 시간 내에 메소드 수행이 완료되지 않으면 rollback 한다.
    • 옵션 값이 -1일 경우에는 timeout을 사용하지 않는다. (= no timeout)
    • 사용법 예시
        @Transactional(timeout=10)
        
  • readOnly
    • 트랜잭션을 읽기 전용으로 설정한다.
    • 기본값 : flase
    • readonly = true 설정 시 insert, update, delete 실행 시 예외 발생
    • 사용법 예시
        @Transactional(readonly = true)
        
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.