1주차 토론 중 재미있는 의문점이 제기 되었습니다.
"수정했다가 다시 원래대로 되돌리면 업데이트 쿼리가 날아갈까?"
- 실험을 위해 간단한 코드를 작성하였습니다.
변경만 해도 Dirty Checking을 통해 update 쿼리가 나갈까요??
잘 날아갑니다.
그렇다면 다시 값을 바꾼다면 어떻게 될까요?
...
select 쿼리만 날아갈 뿐 업데이트 쿼리는 날아가지 않았습니다.
혹시 동일성 비교만 하는 걸까요??
- 같은 value지만 reference는 다른 두 객체를 생성 후 수정하였습니다.
결과는 똑같이 셀렉트 쿼리만 날아갈 뿐 업데이트 쿼리는 날아가지 않았습니다.
스냅샷과 비교는 플러시 시점에 일어나기 때문에
값을 원래대로 돌려놓으면 업데이트 쿼리가 생성되지 않는다.
살짝 더 나아가기
어떻게 비교하길래 , value와 reference를 동시에 체크하는 걸까?
- 기본적으로 Objects.equals() 를 통해 비교하여 두 값 모두 비교 함.
조회만 하는 트랜잭션에 dirty checking을 못 하게 하려면?
- 조회만 하는 트랜잭션엔 로 설정하면 FlushMode를 Manual로 설정하여 더티체킹을 피할 수 있음.
- Entity의 Status가 Delete나 Read only로 설정되어있으면 체킹을 피함.
- dirty checking이 필요한지 확인하고 checking하는 코드
더 공부해보기
- Dirty Checking mechanism
- DefualtFlushEventListener onFlush()
- AbstractEntityPersister findDirty()
- TypeHelper findDirty()
- 이미지 출처