Backend/Spring

Spring Transactional Propagation

keepbang 2022. 12. 28. 17:52

이번에 회사에서 transactional anotation을 사용하면서 부족한 게 많아 정리를 한다!

 

@Transactional

  • DB는 트랜잭션 단위로 쿼리를 실행하며 commit을 통해 작업내용을 처리하고 트랜잭션을 종료한다.
  • spring에서는 Transactional 어노테이션을 통해서 DB connection부터 commit까지의 일련의 작업들을 프록시 형태로 제공한다.
  • spring에서 제공하는 AOP(관점 지향 프로그래밍)중 대표적인것이 바로 이 Transactional 어노테이션이다.

사용 방법은 간단하다.

...
    @Transactional
    public void save(Member member) {}
    
    @Transactional
    public void findById(Long id) {}
...

위 코드 처럼 메서드 위에 붙이면 된다.

 

메서드뿐만 아니라 class위에 붙여서 모든 메서드에 공통적으로 적용할 수 있다.

Transactional에 readOnly라는 속성이 있는데 보통 클래스 위에 readOnly를 true로 해놓고 read가 필요한 메서드에 어노테이션을 붙이는 방식으로 사용한다. (default : false)

@Transactional(readOnly = true)
class Service {
    @Transactional  //insert, update, delete시 필요
    public void save(Member member) {}
    
    public void findById(Long id) {}
}

 

Transactional 어노테이션에는 몇가지 속성들이 있다.

이 포스팅에서는 그중 Propagation에대해 적어볼려고 한다.


Propagation

  • 트랜잭션의 전파 속성으로 기존 트랜잭션에 참여하거나 새로운 트랜잭션을 생성, 부모 트랜젝션의 유무에 따라 예외를 발생시키는  옵션이다.
  • Spring에서 enum으로 관리되고 있다.
  • try-catch를 사용하여 자식 트랜잭션이 실패 했을 때 전체 트랜잭션이 롤백 안되도록 할 수 있다.(REQUIRES_NEW, NESTED)

 

Propagation.REQUIRED(default)

 

  • 설정을 하지 않으면 기본으로 선택된다.
  • 부모 브랜잭션이 존재하면 부모트랜잭션을 따라간다(새로 생성 안됨). 부모 트랜잭션이 없으면 새로운 트랜잭션을 생성한다.
  • 예외가 발생해서 롤백이 되면 예외가 발생한 메서드를 호출한 곳의 작업도 롤백이 된다.

 

Propagation.SUPPORTS

 

  • 트랜잭션이 존재하면 그 트랜잭션을 따라가고 트랜잭션이 없으면 없는 상태로 로직을 수행한다.

 

Propagation.MANDATORY

 

  • 부모 트랜잭션 내에서 실행되며, 트랜잭션이 없을 경우 예외가 발생된다.

 

Propagation.REQUIRES_NEW

 

  • 부모 트랜잭션 상관없이 매 호출시 마다 새로운 트랜잭션을 생성한다.
  • 새로운 트랜젝션 안에서 예외가 발생해도 호출한 곳에서는 롤백이 전파되지 않는다(try-catch로 예외처리를 했을 경우)

 

Propagation.NOT_SUPPORTED

 

  • 트랜잭션이 없는 경우 실행되며 부모 트랜잭션이 존재하면 일시 정지한다.

 

Propagation.NEVER

 

  • 트랜잭션이 없으면 실행하고 트랜잭션이 존재하면 예외가 발생된다.

 

Propagation.NESTED

 

  • 부모 트랜젝션의 커밋과 롤백에는 영향을 받지만 자식 트랜젝션의 커밋과 로백은 부모 트랜잭션에 여향을 주지 않는다.(try-catch사용시)
  • REQUIRES_NEW와 동일해보이지만 다른점은 save point를 지정한 시점까지 롤백이 가능한 점이다.
  • 하지만 이 기능은 DB가 SAVEPOINT를 지원해야 사용 가능하고(oracle에서 사용) JPA에서는 변경감지를 통해서 업데이트문을 최대한 지연, 발행하는 방식을 사용하기 때문에 중첩 트랜잭션 경계를 설정할 수 없어 지원하지 않는다.
JpaDialect does not support savepoints

 

'Backend > Spring' 카테고리의 다른 글

이커머스 서비스에서 동시성 문제 처리해보기  (0) 2024.05.08
Spring Transactional Isolation  (0) 2023.01.04
Spring Bean 설정 방법  (0) 2021.08.29
스프링 빈(Bean)  (0) 2021.08.20
빈 스코프(Bean Scope)  (0) 2021.08.20