플러시(flush)란?
영속성 컨텍스트의 변경내용을 DB에 반영하는 것.
- 영속성 컨텍스트(1차 캐시)를 비우지 않음
- 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화 (변경감지)
- 트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화(flush) 하면 됨 (commit 하면 자동으로 flush 먼저 실행)
플러시 모드 옵션 (보통 AUTO, 건들지 X)
em.setFlushMode(FlushModeType.COMMIT)
- FlushModeType.AUTO : 커밋이나 쿼리를 실행할 때 플러시 (기본값)
- FlushModeType.COMMIT : 커밋할 때만 플러시
persist, flush, commit 비교
em.persist(entity);
1차 캐시에 저장 및 쓰기 지연 SQL 저장소에 SQL 쌓음.
+ em.merge(entity);
DB에서 데이터를 들고와(select 쿼리로 찾아봄) 새로운 데이터로 완전히 교체.
Transation끝날 때 commit올림.
중요!
merge는 영속성 컨텍스트에서 벗어났을 때 사용,,
가급적 데이터 변경은 Transaction속에서 변경 감지(set 이용)를 이용하기.
em.flush();
[그림2]속 1~4번을 담당.
변경을 감지해 수정된 엔티티를 쓰기 저장 SQL 저장소에 등록하고 이 쿼리를 DB에 전송
em.commit();
[그림2]속 1~5번을 담당.
쓰기 지연 SQL저장소 속 SQL이 실제 DB에 flush되고 commit됨.
commit하면 자동으로 flush([그림 2] 속 1~4번) 먼저 실행. (flush 옵션이 AUTO일 때)
추가 정보
flush한다고 commit까지 되는 것은 아니다.
난 commit은 저장이라고 생각함..!
'Spring boot' 카테고리의 다른 글
[spring boot] 2차 정리 (연관관계 매핑 기초, 다양한 연관관계 매핑, 고급 매핑) (0) | 2021.10.28 |
---|---|
[spring boot] 1차 정리(jpa 시작, 영속성관리, 엔티티 매핑) (0) | 2021.10.28 |
[spring boot] 영속성 컨텍스트 (0) | 2021.10.10 |
[Spring boot] H2 DB 연결 & JPA 실행 & 기타 설정, JPQL이란? (0) | 2021.10.09 |
[spring boot] 정적 컨텐츠, MVC와 템플릿 엔진, API (0) | 2021.09.16 |