엔티티매니져 플러시(EntityManager flush)
: 플러시(flush())는 영속성 컨텍스트의 변경 내용을 DB에 반영한다.
이렇게 꼭 외워두자.
구체적으로는 아래와 같이 동작한다.
1. 변경 감지 동작
: 영속성 컨텍스트에 의해 관리되는 엔티티를 스냅샷과 비교하여 수정이 일어난 엔티티에 대한
update 쿼리문을 쓰기 지연 SQL 저장소에 저장한다.
2. 쿼리 실행
: 쓰지 지연 SQL 저장소의 쿼리를 DB에 전송하여 실행한다.
flush() 가 실행되는 경우는 3가지가 있다
1. entitiyManager.flush() 직접 호출
: 테스트 등의 경우를 제외하고 거의 사용하지 않음
2. 트랜잭션 커밋 시점에 자동으로 호출
: DB 변경 내용을 SQL로 전달하지 않고 (flush()를 실행하지 않고) 트랜잭션만 커밋하면 어떤 데이터도 DB에 반영되지 않는다. 따라서 자동으로 플러시를 호출되도록 되어있다.
3. JPQL 쿼리 실행시, 실행 전에 자동으로 호출
: JPQL은 영속성 컨텍스트를 조회하지 않고 SQL로 변환되어 직접 DB에 전달되어 실행된다.
따라서 이전에 영속성 컨텍스트에 저장되었고, 아직 DB에 반영되지 않은 데이터는 조회할 수 없다.
이런 문제를 예방하기 위해 실행전에 플러시를 자동으로 호출하도록 되어있다.
'JPA' 카테고리의 다른 글
(Spring/JPA/Transaction) 쓰기 스큐, 팬텀. Write skew, Phantom (하) (0) | 2020.07.07 |
---|---|
(Spring/JPA/Transaction) 쓰기 스큐, 팬텀. Write skew, Phantom (0) | 2020.07.03 |
(JPA) 프록시, 지연로딩, 즉시로딩 (Proxy / Lazy Loading / Eager Loading) (0) | 2020.04.17 |
(Spring/JPA) Spring transaction logging / jpa entity manager logging (0) | 2020.03.11 |
(JPA) JPA 성능개선이란? 성능개선 적용기 (fetch join/BatchSize) (3) | 2020.03.09 |
댓글