이번엔 플러시와 준영속 상태에 대해서 알아보자
commit은 많이 들어봤는데 flush는 뭘까?
flush는 영속성 컨텍스트의 변경내용을 데이터베이스에 반영하는 행위이다.
실제로 flush가 일어나는 경우는 다음과 같다.
커밋과 비슷한 역할을 하는 거 같지만, 트랜잭션은 여전히 유지되며, SQL이 실행되더라도 커밋되지 않은 상태로 남는다. 또한 트랜잭션 내에서 영구 저장 아니다.
commit 시에 자동으로 flush가 일어나기 때문에 비슷한 동작 같지만 실제로는 다르다.
FlushModeType.AUTO
: 커밋이나 쿼리를 실행할 때 플러시FlushModeType.COMMIT
: 커밋할 때만 플러시다시 영속 상태에 대해서 복기해보면
entityManager을 통해서 JPA로 관리할 수 있는 상태(1차 캐시에 올라가 있는 상태)
라고 할 수 있다.
em.detach(entity)
: 특정 엔티티만 준영속 상태로 전환em.clear()
: 영속성 컨텍스트를 완전히 초기화em.close()
: 영속성 컨텍스트를 종료