[Querydsl] 배치 쿼리로 인한 데이터 불일치 문제

김지수·2023년 8월 21일
0

배치 쿼리를 실행하면 영속성 컨텍스트 안의 값과 DB 안의 값이 일치하지 않는 상황이 발생할 수 있다.
따라서 영속성 컨텍스트 값이 DB 값과 일치할 수 있도록
em.flush();
em.clear();
를 함께 사용해 영속성 컨텍스트를 초기화 해야 한다.

// 변경 내용을 데이터베이스에 동기화
em.flush();

// 영속성 컨텍스트 초기화
em.clear();
  1. em.flush()
    영속성 컨텍스트 내에서 변경된 내용이 데이터베이스로 동기화된다.
    그러나 이후에 다시 쿼리를 실행할 때 영속성 컨텍스트 내에 남아있는 엔티티들은 여전히 이전 상태를 가지고 있을 수 있으므로 em.clear()를 함께 사용해야 한다.

  2. em.clear()
    영속성 컨텍스트의 모든 엔티티와 관련된 상태가 초기화된다. 따라서 영속성 컨텍스트에 남아있는 엔티티들은 모두 분리(detached) 상태가 된다.
    이후에 새로 엔티티를 로드하거나 변경 내용을 데이터베이스에서 다시 가져올 때 영속성 컨텍스트가 새로운 상태로 초기화되기 때문에, 데이터베이스와 일치하는 값을 가져올 수 있다.

profile
안녕하세요

0개의 댓글