[20210517] @Transactional

@Transacional은 메서드와 클래스에 선언할 수 있으며, 클래스에 선언할 시에는 클래스에 선언된 모든 메서드에 대한 설정을 할 수 있다. 만약 클래스에도 선언 되어 있고 메서드에도 선언되어 있을 시에는 메서드에 선언된 옵션을 우선순위로 한다.

readOnly

@Transactional 의 속성 중 readOnly를 true로 설정하게 되면 persistence provider에게 해당 transaction은 readOnly만 가능하다는 힌트를 주게 되어 해당 transaction의 성능에 영향을 줄 수 있다고 한다. 왜냐면 persistence provider는 해당 transaction이 끝나고 나서 dirty 여부를 파악하게 되는데 이를 하지 않아도 되기 때문이다.
하지만 이 readOnly 속성이 vendor들 마다 다르게 처리 할 수도 있다고 한다. 또한 @Transactional이 선언안된 메서드에서 호출할 경우 transaction이 만들어 지지 않고 해당 속성이 무시될 수도 있다고 한다.

원래는 이거를 정리하기 위해 만든 포스트이지만, 생각보다 더 많은 기능을 제공하고 있어서 다른 기능들도 가볍게 소개 해보려 한다.!🤣

isolation

얼만큼의 데이터 일관성을 유지할 것인지에 대한 속성값

propagation

자신의 Transactional 속성을 부모 트랜잭션에 얼만큼 전파할 것이냐는 그런 전략을 설정하는 속성값

timeout

@Transactional로 감싸진 함수에 대한 timeout을 설정할 수 있다.

rollback rules

기본적으로 rollback은 런타임 중에 발생하며, unchecked exception에 대해서만 발생한다. 하지만 rollbackFor 와 noRollbackFor를 설정하면 checkedException에 대해서도 rollback을 발생시킬 수 있다.


출처

Transactions with Spring and JPA