공유 데이터 하나를 동시에 봄

격리성이 없으면 T2는 확정 전 400만원을 현재 잔고로 오해합니다.

핵심은 값이 바뀌었다는 사실보다, 그 값이 아직 COMMIT되지 않은 중간 상태라는 점입니다. 다른 트랜잭션이 이 순간을 보면, 나중에 롤백될 수도 있는 상태를 기준으로 판단하게 됩니다.

격리성이 지키는 선 COMMIT 전 값은 다른 트랜잭션에 보이면 안 됩니다.

격리성은 각 트랜잭션이 혼자 실행된 것처럼 보이게 만듭니다. 즉, 오른쪽의 최종 확정 상태만 공유되어야 하고, 가운데의 임시 상태는 숨겨져야 합니다.

T1
A 잔고를 400만원으로 변경 이체 작업 중간 단계이며 아직 COMMIT하지 않음
오류 발생 후 ROLLBACK 실패했으므로 변경을 취소하고 원래 값으로 되돌림
공유값
커밋된 시작값
500만
A 계좌의 실제 잔고
T1의 중간 상태
400만
되돌아갈 수 있는 미커밋 값
롤백 후 확정값
500만
DB에 남는 최종 상태
T2
여기서 읽은 값 400만
T2는 이 값을 현재 잔고라고 믿고 다음 로직을 수행할 수 있습니다.
실제 확정된 값 500만
T1이 롤백되면 T2가 읽은 400만원은 존재하지 않았던 상태가 됩니다.
Dirty Read는 다른 트랜잭션의 롤백될 수도 있는 중간 상태를 읽는 문제입니다. 격리성은 이런 값을 숨겨서, 각 트랜잭션이 혼자 실행된 것처럼 보이게 만듭니다.