Transactional 옵션

KHoney·2022년 11월 18일
0

Java

목록 보기
10/10

Spring에서 사용하는 어노테이션 '@Transactional'은 해당 메서드를 하나의 트랜잭션 안에서 진행할 수 있도록 만들어주는 역할을 한다.

전파 설정 옵션

트랜잭션의 전파 설정은 @Transactional의 옵션 propagation을 통해 설정할 수 있다.

REQUIRED (default)

부모 트랜잭션이 존재한다면 부모 트랜잭션으로 합류한다. 부모 트랜잭션이 없는 경우 새 트랜잭션을 생성.

롤백이 발생한다면 하나의 트랜잭션이기 때문에 진행사항이 모두 롤백된다.

REQUIRES_NEW

새로운 트랜잭션을 생성한다.

만약, 호출한 곳에서 이미 트랜잭션이 설정되어 있다면(기존 연결이 있다면) 기존의 트랜잭션은 메소드가 종료할 때까지 잠시 대기 상태로 두고 자신의 트랜잭션을 실행한다.

새로운 트랜잭션 안에서 예외가 발생해도 호출한 곳엔 롤백이 전파되지 않는다.

즉, 2개의 트랜잭션이 완전 독립적으로 동작한다.

MANDATORY

부모 트랜잭션 내로 합류한다.

만약 부모 트랜잭션이 없다면 예외를 발생시킨다.

NESTED

해당 메소드가 부모 트랜잭션에서 진행될 경우 별개로 커밋되거나 롤백될 수 있다.

REQUIRED와의 차이점은 SAVEPOINT를 지정한 시점까지 부분 롤백이 가능하다.

유의해야 할 점은 DB가 SAVEPOINT 기능을 지원해야 사용이 가능(Oracle)하다.

또한 이미 진행중인 트랜잭션이 있다면 중첩 트랜잭션을 시작한다.

NEVER

트랜잭션을 생성하지 않는다.

부모 트랜잭션이 존재한다면 예외를 발생시킨다.

SUPPORTS

부모 트랜잭션이 있다면 합류한다.

진행중인 부모 트랜잭션이 없다면 트랜잭션을 생성하지 않는다.

NOT_SUPPORTED

부모 트랜잭션이 있다면 보류시킨다.

진행중인 부모 트랜잭션이 없다면 트랜잭션을 생성하지 않는다.

@Transactional 사용시 주의사항

  • @Transactional을 클래스 또는 메소드 레벨에 명시하면 해당 메소드 호출시 지정된 트랜잭션이 작동하게 된다. 단, 해당 클래스의 Bean을 다른 클래스의 Bean에서 호출할 때만 @Transactional을 인지하고 작동하게된다.
profile
좋은 개발자가 되고싶은

0개의 댓글