안녕하세요. 재고수량이 마이너스가 되는 동시성 문제를 해결하려고 쿼리문에 낙관적 동시성 제어 방법을 적용하였는데요
UPDATE prod_opt
SET INV_QTY = INV_QTY - #{qty}
, UPD_DTTM = now()
WHERE OPT_COMB_NO = #{optCombNo}
AND INV_QTY >= #{qty}
where 절에 'INV_QTY >= #{qty}' 이 부분에서 INV_QTY를 값을 읽어올 때는 Consistent 모드로 읽어오는 건가요 Current 모드로 읽어오는 건가요? 결과를 보니 Current 모드로 읽어오는 것 같긴 한데
친절한 SQL 튜닝 책에서 MVCC 부분을 살펴보니 'DML 문은 Consistent 모드로 대상 레코드를 찾고', 'Consistent 모드로 DML 문이 ‘시작된 시점’에 존재했던 데이터 블록을 찾고' 이부분 때문에 너무 헷갈려서요 ㅠ 대상을 업데이트할 때는 원본 블록에 한다는 건 알겠는데 해당 update 쿼리에서 where절에 있는 데이터를 읽어올 때 Consistent 모드로 읽어오는 건지.. Current 모드로 읽어오는 건지 모르겠습니다....
업데이트 쿼리가 시작되는 시점에는 consistent 모드 읽기
최종 반영 시점에는 다시 한번 더 current 모드로 읽기
시점 차이에 따라서, 최초 읽어온 데이터와 최종 반영 데이터가 다를 수 있음.
http://www.gurubee.net/lecture/3142