이번에 회사에서 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 |