작성
·
362
0
안녕하세요 영한님. 강의 정말 잘 듣고 있습니다. 감사합니다.
궁금한것이 생겨 다른 질문들도 확인해 보았는데 궁금증이 해소되지 않아 질문드립니다. ㅜ
질문 내용은
- 벌크연산의 JPQL 쿼리 직후(em.flush() 실행 전),
- 다른 쓰레드에 의해 영속성 컨텍스에서 엔티티 수정이 이루어지면,
- em.flush()에 의해 DB가 영속성 컨텍스 내용으로 덮어씌워져 벌크연산 결과가 사라질 수 있지 않은지?
입니다.
그리고 문제가 있다면 어떻게 해결해야 하는지 알고싶습니다.
예시) 시간순서로 나열했습니다.
member1의 age는 20이라고 가정하겠습니다.
Thread1 Thread2
member1 조회
(영속상태가 됨)
QueryDSL로 벌크연산
(DB 수정, age 를 2배로 변경)
(JPQL로 인한 flush가 실행되나
아직까지 DB와 영속성 컨텍스트
차이 없음)
member1 수정
(age에 1 추가)
(dirtycheck 체크됨)
em.flush(), em.clear()
(여기서 문제발생?)
em.flush()가 실행되는 시점에 member1이 수정되어 있으니 영속성 컨텍스트에 있는 member1의 age값 21이 DB에 있는 age값 40을 덮어쓰지 않나요?
만약 이런 문제가 발생한다면 이를 막기위해 어떻게 해야 하나요?
답변 1
0
안녕하세요. Jihwan Jang님
사실 이 문제는 JPA의 사용과는 무관하게 발생할 수 있는 트랜잭션과 락과 관련된 문제입니다.
JPA 책 16.1 트랜잭션과 락에서 해당 부분을 자세히 다루고 있으니 참고해보시면 도움이 되실거에요^^
감사합니다.