@Transactional(readonly=true)
@Transactional(readonly=true)
@Transactional(readonly=true)
@Transactional
은 Spring에서 메소드가 트랜잭션이 되도록 보장해주는 annotation- 주로
Service 클래스 자체
혹은Service 내부의 메소드
들에 붙음 Service 클래스 자체
에 붙으면 모든 메소드에@Transactional
을 붙인 것과 동일
- 주로
- 기본적으로 이 어노테이션의
readonly
값은false
임 - 그러나 읽기만 필요한 메소드의 경우 이
readonly
값을true
로 두면, 메소드 내부에서flush
가 일어나지 않음 - 즉, 트랜잭션이 커밋되어 DB가 변경되는 일을 방지 가능
- 그러나 강제로
flush
를 호출한다면 변경될 수 있음
readonly=true 장점
- 개발자가 해당 메소드가 읽기 전용이라는 점을 알게 쉽게 함
- 영속성 컨텍스트에 관리를 받지 않아 성능상 이점이 존재
- 변경에 대한 감지를 하지 않음
- 스냅샷을 가지고 있지 않아도 됨
- 더 낮은 isolation level을 가지고 있음
Repetable Read
를 위해 필요한 Transaction ID를 부여하지 않아 오버헤드 감소
- Master-Slave DB 구조에서 slave DB를 읽어 부하를 분산시킬 수 있음
References
- https://velog.io/@jurlring/TransactionalreadOnly-true%EC%97%90%EC%84%9C-readOnly-true%EB%8A%94-%EB%AC%B4%EC%8A%A8-%EC%97%AD%ED%95%A0%EC%9D%B4%EA%B3%A0-%EA%BC%AD-%EC%8D%A8%EC%95%BC%ED%95%A0%EA%B9%8C
- https://cupeanimus.tistory.com/90
- https://algopoolja.tistory.com/104
- https://jaehoney.tistory.com/298