⚡ 생각대로 살지 않으면 사는대로 생각한다.

⚡ 나는 어차피 잘 될 놈이다. 이미 잘 되고 있고, 계속해서 잘 되고 있다.


플러시

  • 영속성 컨텍스트의 변경내용을 데이터베이스에 반영
  • 영속성 컨텍스트의 변경사항과 데이터베이스 내용을 맞춰준다고 보면 된다.
  • 보통 트랜잭션 커밋을 하면 발생한다

플러시 발생

  • 변경 감지
  • 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
  • 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송(등록, 수정, 삭제 쿼리)

플러시가 발생한다고해서 데이터베이스 트랜잭션이 커밋되는 것이 아니고, 쿼리를 보내고 커밋을 한다.

영속성 컨텍스트를 플러시하는 방법

  • em.fulsh() - 직접 호출
  • 트래잭션 커밋 - 플러시 자동 호출
  • JPQL 쿼리 실행 - 플러시 자동 호출


위와 같이 코드를 작성하고, 아래의 결과를 보면, flush를 한 시점에 SQL 쿼리를 날린다.

flush를 한다해도, 1차 캐시는 지워지지 않는다.

플러시는 변경사항 SQL이 반영되는 과정이다!

JPQL 쿼리 실행시 플러시가 자동으로 호출되는 이유

memberA,memberB,memberC를 persist한다고해서 DB에 반영되지는 않는다. 어떤 쿼리를 날려서 DB에 반영해줘야 한다.
그리고, 아래 JPQL은 select문으로 조회를 하는 쿼리인데, DB에 반영되지 않은 상태에서 조회를 한다고해서 반영되진 않는다.

JPA는 JPQL을 실행하기 전에 무조건 flush로 쿼리를 날리게 되어있다.
그래서 위 JPQL을 실행하면, memberA , memberB, memberC를 조회할 수 있다.

플러시 모드 옵션

  • FlushModeType.AUTO
    • 기본값
    • 커밋이나 쿼리를 실행할 때 플러시
  • FlushModeType.COMMIT
    • 커밋할 때만 플러시
    • 즉, 쿼리실행시엔 플러시하지 않음.

영한좌 : 그냥 AUTO로 쓰십쇼~

플러시는!

  • 영속성 컨텍스트를 비우는 것이 아니다.
    • 1차캐시 지워지지 않는다.
  • 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화
  • 트랜잭션이라는 작업 단위가 중요!
    • 커밋 직전에만 동기화하면 된다.
    • 영속성 컨텍스트와 트랜잭션의 주기를 맞춰서 설계를 하는 것이 좋다.

      JPA는 동시성에 대한 것을 데이터베이스 트랜잭션에 다 위임해서 사용한다.


-끝-

profile
쌩수 Git >> https://github.com/SsangSoo?tab=repositories

0개의 댓글