Dirty Read

커밋되기 전의 200만원을 사실처럼 읽으면, 롤백 뒤에는 그 판단 근거가 사라집니다.

오손 읽기는 확정되지 않은 중간값을 다른 트랜잭션이 읽는 문제입니다. 문제의 본질은 값을 잠깐 봤다는 데 있지 않고, 그 값을 기준으로 후속 처리가 시작된다는 데 있습니다.

1. 시작모두가 믿는 확정 상태
2. T1 수정아직 커밋되지 않음
3. T2 읽음잠정값을 그대로 참조
4. T1 롤백잠정값이 사라짐
T1
변경 전
아직 쓰기 작업 없음
공유 데이터는 안정된 상태입니다.
미커밋
UPDATE balance = 200
값을 바꿨지만 아직 COMMIT 하지 않았습니다.
대기 중
수정은 보이지만 확정 전
이 상태의 값은 언제든 취소될 수 있습니다.
취소
ROLLBACK
T1의 변경은 없던 일이 됩니다.
공유 잔고
확정값
100만원
지금 실제로 존재하는 잔고
잠정값
200만원
보일 수는 있지만 아직 사실로 확정되지 않았습니다.
더러운 데이터
200만원
T2가 읽은 순간, 문제의 기준값이 됩니다.
실제 확정값
100만원
데이터베이스에 남는 값은 처음 상태뿐입니다.
T2
읽기 전
아직 판단 기준 없음
문제도 아직 시작되지 않았습니다.
대기
읽지 않았다면 안전
확정 전 값에 의존하지 않습니다.
문제 발생
SELECT balance -> 200
T2는 200만원을 실제 잔고라고 믿고 계산을 시작합니다.
후속 처리
이미 200만원 기준으로 계산 완료
근거가 사라졌는데도 계산 결과는 남아 버립니다.
마지막 불일치
DB에 남은 실제 상태 100만원
T2가 사용한 계산 기준 200만원

이렇게 존재하지 않는 값을 기반으로 계산하게 되면 오손 읽기입니다. 그래서 보통 READ UNCOMMITTED에서만 가능하고, READ COMMITTED 이상에서는 막습니다.