[DB] 트랜잭션의 전파 레벨 (Propagation)
26 Feb 2023트랜잭션 전파 레벨 (Propagation)
Spring에서는 @Transaction
을 통해 DB의 Transaction을 관리 할 수 있다.
DB에서 관리하는것 외에 Spring에서 개발자들의 편의를 위해 제공하는 기술이라고 생각하면 된다.
@Transactional(propagation = Propagation.REQUIRED)
@Transaction
어노테이션에 propagation
옵션을 주어 사용할 수 있다.
트랜잭션 전파레벨의 종류
트랜잭션의 전파레벨에는 7가지가 있는데, 실무에서 주로 사용되는 것은 REQUIRE
, REQUIRES_NEW
, NESTED
이렇게 세가지 정도만 알아두면 된다.
그래도 간단하게나마 알아보도록 하자.
REQUIRE
@Transactional(propagation = Propagation.REQUIRED) Support a current transaction, create a new one if none exists.
트랜잭션이 존재하지 않는 경우 현재 범위에 대해 로컬로 물리적인 트랜잭션을 적용하거나, 부모 트랜잭션이 존재하는 경우 더 큰범위에 대해 정의된 기존 부모 트랜잭션에 참여한다.
@Transaction
의 기본값이기 때문에 따로 설정을 주지 않아도 된다.
REQUIRE_NEW
@Transactional(propagation = Propagation.REQUIRED_NEW) Create a new transaction, and suspend the current transaction if one exists.
REQUIRED
와 달리 영향을 받는 각 트랜잭션 범위에 대해 항상 독립적인 새로운 트랜잭션을 생성하고, 부모 트랜잭션에는 참여하지 않는다. 각각의 트랜잭션이 롤백되어도 서로 영향을 주지 않는다.
NESTED
@Transactional(propagation = Propagation.NESTED) Execute within a nested transaction if a current transaction exists, behave like REQUIRED otherwise.
NESTED
는 직역하면 중첩된 이라는 뜻으로 부모 트랜잭션이 존재할 경우 중첩된 새로운 트랜잭션을 생성한다. 만약 중첩된 트랜잭션 내부에서 롤백이 발생될 경우 해당 중첩 트랜잭션의 시작 지점까지만 롤백이 진행된다.
중첩 트랜잭션은 부모 트랜잭션이 커밋될 때 같이 커밋이 진행된다.
부모 트랜잭션이 없다면 새로운 트랜잭션을 생성한다.
NEVER
@Transactional(propagation = Propagation.NEVER) Execute non-transactionally, throw an exception if a transaction exists.
트랜잭션을 생성하지 않는다. 부모 트랜잭션이 존재한다면 예외를 발생시킨다.
MANDATORY
@Transactional(propagation = Propagation.MANDATORY) Support a current transaction, throw an exception if none exists.
부모 트랜잭션이 있을 경우 참여한다. 만약 부모 트랜잭션이 없을 경우 예외를 발생시킨다.
SUPPORTS
@Transactional(propagation = Propagation.SUPPORTS) Support a current transaction, execute non-transactionally if none exists.
부모 트랜잭션이 있을 경우 부모 트랜잭션에 참여하고, 없다면 트랜잭션을 생성하지 않는다.
NOT_SUPPORTED
@Transactional(propagation = Propagation.NOT_SUPPORTED) Execute non-transactionally, suspend the current transaction if one exists.
부모 트랜잭션이 있을 경우 일시 중단한다. 진행중인 부모 트랜잭션이 없다면 트랜잭션을 생성하지 않는다.