@Transactional

yshjft·2022년 9월 2일
0

Spring, JPA

목록 보기
2/16

언제 사용?

일련의 작업들을 묶어서 하나의 단위로 처리하고 싶은 경우 사용한다. @Transactional이 적용된 모든 클래스/메서드에 대한 프록시 생성하게된다. 해당 프록시는 트랜잭션을 시작/커밋하기위해 실행 중인 메서드의 전후로 트랙잭션 로직을 주입하게 된다.

테스트 환경에서의 @Transactional 동작

메서드가 종료될 때 자동으로 데이터들이 롤백된다.

왜 Auto Increment Id는 롤백되지 않는가?

Auto Increment는 동시성 이슈 때문에 트랙잭션 범위 밖에서 이루어지기에 Auto Increment Id는 롤백되지 않는다.

No, auto-increment mechanisms must work outside the scope of transactions, because another user may be inserting to the same table before you finish your transaction. The other user's transaction must be able to allocate the next value, before knowing whether your transaction is using the value you just allocated.

@Transactional 사용시 주의 사항

  • public 외의 모든 접근제어자는 @Transactional을 선언해도 적용되지 않는다.
  • @Transactional 을 달아놓은 메소드가 동일한 클래스 내의 다른 메소드에 의해 호출된다면 트랜잭션이 정상 작동하지 않는다.
    • spring에서 @Transactional은 인스턴스에서 처음으로 호출하는 메서드나 클래스의 속성을 따라가게 되어서 동일한 class안에 상위 메소드에 @Transactional이 없으면 하위에 선언되어 있다하더라도 전이되지 않는다. 
    • @Transactional을 상위로 배치 또는 메서드를 분리하면 해당 문제를 해결할 수 있다.
    • 클래스 또는 메소드에 @Transactional 어노테이션이 선언되면 메소드에 대해 트랜잭션이 적용된 프록시 객체를 생성한다.
    • 클래스에 설정할 경우 클래스에 있는 모든 public 메서드에 transaction 적용
    • 메서드에 설정할 경우 설정한 method에만 적용
    • @Transactional 과 PROXY
  • Spring Transaction은 기본적으로 unchecked Exception(런타임익셉션)만 관리하며 checked Exception(IOException, SQlExcption)등은 관리하지않는다.

@Transactional과 PSA(Potable Service Abstraction)

JDBC를 통한 접근(DatasourceTransactionManager)을 사용하던 JPA(JpaTransactionManager)를 사용하던 @Transactional을 사용할 수 있습니다. 이는 여러 서비스들을 하나의 추상화로 묶어 놓은 PSA가 사용되었기 때문이다.

Spring의 핵심기술 PSA - 개념과 원리

@Transactional 어노테이션 우선 순위

클래스 메소드 > 클래스 > 인터페이스 메소드 > 인터페이스

profile
꾸준히 나아가자 🐢

0개의 댓글