READ UNCOMMITTED의 핵심 위험

미커밋 값을 읽는 순간, 잘못된 값이 다른 데이터로 복사될 수 있습니다.

단순히 “잠깐 틀리게 본다”에서 끝나지 않습니다. 아직 확정되지 않은 가격 0을 T2가 주문에 저장하고 커밋하면, 뒤에서 T1이 롤백돼도 이미 만들어진 주문은 그대로 남습니다.

학습 포인트
Dirty Read는 조회 오류가 아니라
정합성 불일치로 번질 수 있습니다.
그래서 실무에서는 대략적 통계처럼 정확도보다 응답 속도가 더 중요한 경우에만 제한적으로 고려합니다.
공유된 상품 행 `상품(id=1)` 하나의 값이 세 시점을 거치며 어떻게 보이는지
시작

원래 커밋 값

10000

모든 트랜잭션이 일관되게 보는 정상 가격입니다.

T1 수정 중

잠시 0으로 변경

0

아직 COMMIT되지 않은 값이라 확정 상태가 아닙니다.

ROLLBACK 후

상품 값은 복구

10000

상품 자체는 되돌아가지만, 이미 퍼진 값까지 자동으로 복구되지는 않습니다.

T1: 값을 바꾸지만 확정하지 않음 수정 후 롤백
1. `UPDATE 상품 SET 가격 = 0` 으로 값을 바꿉니다.
2. 아직 COMMIT하지 않았으므로 이 값은 임시 상태입니다.
3. 마지막에 ROLLBACK하면 상품 가격은 10000으로 돌아갑니다.
T2: 미커밋 0을 읽고 주문에 저장 Dirty Read 발생
SELECT 가격 FROM 상품  → 0
INSERT INTO 주문 (상품id, 가격) VALUES (1, 0)
COMMIT
READ UNCOMMITTED라서 아직 확정되지 않은 가격 0을 그대로 읽고, 그 값을 주문 데이터에 복사해 버립니다.
최종 상품 상태 가격 10000

T1의 롤백으로 원래 값으로 복구됩니다.

최종 주문 상태 가격 0

T2가 이미 커밋했으므로 잘못 읽은 값이 그대로 남습니다.

결론: READ UNCOMMITTED는 “잠깐 잘못 본 값”을 허용하는 수준이 아니라, 그 값이 다른 테이블과 후속 계산에 반영되면 실제 데이터 불일치로 굳어질 수 있습니다.