2023. 12. 20. 02:26ㆍ카테고리 없음
Flush
flush는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 것이다.
쌓아뒀던 쿼리문이 데이터베이스에 날아가는 것을 말한다.
보통 데이터베이스 transaction 이 commit 될 때 flush 가 일어난다.
Flush 가 발생하면
1. 변경 감지가 일어난다.
2. 수정된 entity를 쓰기 지연 SQL 저장소에 등록한다.
3. 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다(등록, 수정, 삭제 쿼리 등).
flush 가 발생한다고 해서 데이터베이스 transaction 이 commit 되는 건 아니다.
보낸 다음에 데이터베이스 transaction 을 커밋한다.
영속성 컨텍스트를 flush 하는 방법
1. em.flush() - 직접 호출
2. transaction commit - 자동 호출
3. JPQL 쿼리 실행 - 자동 호출
마지막
flush 는 영속성 컨텍스트를 비우는 게 아니다.
영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화하는 것이다.
transaction 이라는 작업 단위가 중요하다. -> 커밋 직전에만 동기화하면 된다.
flush 라는 메커니즘이 동작할 수 있는 이유는 transaction 이라는 작업 단위가 있기 때문이다.
어쨌든 transaction commit 직전에만 변경 내용을 데이터베이스에 날리면 되기 때문에 이런 메커니즘이 가능해진다.
+ JPA는 기본적으로 데이터를 맞추는 등 동시성에 대한 부분은 모두 데이터베이스 transaction 에 위임해서 사용한다.
JPA 에서 데이터를 변경하는 모든 작업은 꼭 transaction 안에서 작업해야 한다(단순 조회를 제외한 나머지는 꼭 transaction)