김영한님의 JPA 강의를 보고 정리한 내용입니다.
영속성 컨텍스트의 현재 변경 사항을 데이터베이스에 반영하는 행위를 말한다. 쉽게 말해, 영속성 컨텍스트에 쌓인 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송함으로써, 영속성 컨텍스트와 데이터베이스를 동기화하는 행위라고 할 수 있다.
이때 flush를 한다고 해서 영속성 컨텍스트를 비우는 것은 아니다. 1차 캐시와 쓰기 지연 SQL 저장소 모두 비워지지 않는다. 단순히 변경 내용을 데이터베이스에 동기화하는 작업일 뿐이다.
flush는 결국 트랜잭션이라는 개념이 있기 때문에 가능한 것이다. 쿼리를 따로 보내든지, 모아서 한번에 보내든지 커밋 직전에 동기화하면 되기 때문이다.
변경 감지(Dirty Checking)가 일어난다.쓰기 지연 SQL 저장소에 등록한다. 이때 flush()가 발생한다고 해서 데이터베이스 트랜잭션이 커밋되는 것은 아니다. 단순히 저장소 안에 있는 쿼리들이 데이터베이스에 전송되는 것이지 실제로 반영되는 시점은 commit() 시점이다.
예시를 들자면 DBMS에서 트랜잭션을 사용할 때도 커밋이 되기 전까지는 실제로 데이터베이스에 반영되지 않는다. 그리고 커밋이 수행된 후에 실제 데이터베이스에 트랜잭션의 작업 내용이 반영 되는 것과 동일하다.
em.flush() - 직접 호출em.setFlushMode(FlushModeType.AUTO)를 사용한다.FlushModeType.AUTO: 커밋이나 쿼리를 실행할 때 flush 실행 (기본 값)FlushModeType.COMMIT: 커밋할 때만 flush 실행