영원히 남는 기록, 재밌게 쓰자

영속성 컨텍스트의 플러시(flush)에 대해서 본문

springboot/JPA

영속성 컨텍스트의 플러시(flush)에 대해서

youngjae-kim 2024. 2. 21. 14:48
728x90
반응형

플러시가 발생한다고 해서 트랜잭션이 커밋되는 것은 아니다. 플러시로 보낸 다음 tx.commit()과 같이 트랜잭션 커밋을 따로 해줘야 한다.

flush()를 직접 호출할 일은 잘 없긴하다. flush()를 하는 경우를 보면

  • em.flush()와 같이 직접 플러시를 호출
  • 트랜잭션의 commit 호출 시 자동 플러시 호출
  • JPQL 쿼리 실행 시 플러시가 자동 호출

플러시가 발생한다고 1차 캐시가 비워지는가?

아니다 플러시가 발생한 경우 변경 감지를 하여 변경이 되었거나 조회, 삭제 등으로 쓰기 지연 SQL 저장소에 쌓여있던 SQL 들이 실행되어 데이터 베이스에 반영이 되는 과정이다. 그래서 1차 캐시를 비우지 않는다.

  • 플러시는 영속성 컨텍스트를 비우는 작업이 아니다.
  • 영속성 컨텍스트의 변경 내용을 데이터 베이스에 동기화하는 과정이다.
  • 플러시는 트랜잭션이란 작업 단위가 중요하다 → 커밋 직전만 동기화를 하면 된다. (커밋을 통해 DB에 반영시켜야 하기 때문)

JPA 동시성에 관한 것은 DB 트랜잭션에 위임해서 동작하기 때문에 이런 것들이 가능하다!!!

728x90
반응형