Spring에서 사용하는 어노테이션 '@Transactional'은 해당 메서드를 하나의 트랜잭션 안에서 진행할 수 있도록 만들어주는 역할을 한다.
트랜잭션의 전파 설정은 @Transactional
의 옵션 propagation
을 통해 설정할 수 있다.
부모 트랜잭션이 존재한다면 부모 트랜잭션으로 합류한다. 부모 트랜잭션이 없는 경우 새 트랜잭션을 생성.
롤백이 발생한다면 하나의 트랜잭션이기 때문에 진행사항이 모두 롤백된다.
새로운 트랜잭션을 생성한다.
만약, 호출한 곳에서 이미 트랜잭션이 설정되어 있다면(기존 연결이 있다면) 기존의 트랜잭션은 메소드가 종료할 때까지 잠시 대기 상태로 두고 자신의 트랜잭션을 실행한다.
새로운 트랜잭션 안에서 예외가 발생해도 호출한 곳엔 롤백이 전파되지 않는다.
즉, 2개의 트랜잭션이 완전 독립적으로 동작한다.
부모 트랜잭션 내로 합류한다.
만약 부모 트랜잭션이 없다면 예외를 발생시킨다.
해당 메소드가 부모 트랜잭션에서 진행될 경우 별개로 커밋되거나 롤백될 수 있다.
REQUIRED와의 차이점
은 SAVEPOINT
를 지정한 시점까지 부분 롤백이 가능하다.
유의해야 할 점
은 DB가 SAVEPOINT 기능을 지원해야 사용이 가능(Oracle)하다.
또한 이미 진행중인 트랜잭션이 있다면 중첩 트랜잭션
을 시작한다.
트랜잭션을 생성하지 않는다.
부모 트랜잭션이 존재한다면 예외를 발생시킨다.
부모 트랜잭션이 있다면 합류한다.
진행중인 부모 트랜잭션이 없다면 트랜잭션을 생성하지 않는다.
부모 트랜잭션이 있다면 보류시킨다.
진행중인 부모 트랜잭션이 없다면 트랜잭션을 생성하지 않는다.
@Transactional
을 인지하고 작동하게된다.