728x90
반응형
SMALL
@Transactional(readOnly = true) 은 왜 사용해요?
장단점을 확인해보면서 알아보자
장점
- readOnly = true 사용시,
하이버네이트 세션 플러시 모드를 MANUAL
로 적용한다. 때문에 강제로 flush를호출해야만 flush가 일어난다. 때문에 엔티티의 변경되는 동작을 하지 않기 때문에엔티티 변경에 안전
하다. 또한JPA
는 해당 트랜잭션 내에서 조회하는 Entity는 읽기전용으로 인식하고,변경 감지를 위한 Snapshot
을 따로 보관하지 않으므로메모리가 절약
되는성능상 이점
,(그냥 @Transactional 만사용하면@Transactional 사용 영역
에서는JPA의 스냅샷 유지
,flush의 필요성
,DB 커넥션을 오래 물고 있는
등의관리적인 오버헤드 발생
이라는 단점 존재)
- 나는 조회용 메서드에요! 라는
직관성
측면에서의이점
Master - Slave 구조의 DB
운영시, 데이터 read 작업은 오로지 slave 에서 진행하므로 Master와 Slave의트래픽 분산이점
public class RoutingDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { //readOnly 는 slave로 핸들링 가능 return (TransactionSynchronizationManager.isCurrentTransactionReadOnly()) ? "slave" : "master"; } }
- read 쿼리시 db에
불필요한 Lock 을 걸지 않음
(벤더마다 다름) (mysql 공식문서:https://dev.mysql.com/doc/refman/8.0/en/innodb-performance-ro-txn.html)

단점
- 당연히 데이터 조회에 대한 로직만 들어가야겠지만 혹시나 데이터 변경에 관한 로직이 들어갈경우 의도치 않은 문제 발생, DB의 낙관적 락의 경우 동시에 두 트랜잭션(t1,t2)이 엔티티에 update를 할 때, 그 사이에 읽기 트랜잭션(t3)가 실행될 경우에 데이터
버전의 충돌감지
가 안되기 때문에 정합성이 깨질수도 있다.
728x90
반응형
LIST
'SPRING > JPA' 카테고리의 다른 글
JPA에서 transaction, AOP로 더티체킹이 되지 않는 이유 (0) | 2024.04.25 |
---|---|
JPA 엔티티 이름대문자로 설정하기 (0) | 2022.05.31 |
웹 애플리케이션과 영속성 관리 (0) | 2022.03.30 |
객체지향 쿼리언어 (0) | 2022.03.26 |
jpa metamodel must not be empty! 테스트 에러 (0) | 2022.03.24 |