21.05.05 11:22 작성
·
355
0
안녕하세요 영한님
벌크성 수정 쿼리 강의해주실 때
em.flush()
em.clear()
를해야한다(영속성 컨텍스트에 있는 캐시정보들을 DB에 반영하기 위해)고 말씀해주셨는데
만약 어떤 user들의 age가 20이 넘는 사람의 인원수가 5명이라고 가정하고 이들의 나이를 1씩 올렸다고 가정했을때
캐시에는 반영이 안되고 바로 DB에만 반영이 되는데 이때 제가 궁금했던것은 em.flush를 하면 1치캐시에 있는것을 db에 반영시키는것(더티체킹을 포함하여) 이라고 생각해서 이 경우에는 1차캐시가 반영되면 안되는것 아닌가요?
캐시 | DB | -> 벌크성수정쿼리-> | 캐시 | DB | -> em.flush() -> | 캐시 | DB |
---|---|---|---|---|---|---|---|
40 | 40 | 40 | 41 | 40 | 40 |
답변 1
1
2021. 05. 06. 20:36
안녕하세요. fightnyy님 좋은 질문입니다.
먼저 JPQL을 실행하게 되면 JPQL 실행 직전에 자동으로 플러시가 호출 됩니다.
벌크 연산도 JPQL을 실행하는 것이기 때문에 플러시가 발생합니다. 따라서 이 경우 em.flush()를 실행하지 않아도 됩니다.
그런데 이 경우에도 em.flush()를 사용하는게 좋은데 이 이유는 다음 링크를 참고해주세요.
https://www.inflearn.com/questions/188207
감사합니다.