쓰기-쓰기는 최종 값을 잃고, 읽기-쓰기는 읽는 동안 보이는 값, 같은 행, 결과 범위가 차례로 흔들린다.
| 충돌 조합 | 무엇이 바뀌나 | 이상 현상 | 실무 의미 |
|---|---|---|---|
| 쓰기-쓰기 같은 행을 둘 다 수정 | 마지막 쓰기가 앞선 값을 덮어쓴다 두 트랜잭션이 같은 행을 갱신했지만 최종 상태에는 하나만 남는다. 100 → T1:120, T2:130 → 최종 130 | 갱신 분실 앞선 UPDATE의 효과가 사라짐 |
데이터 손실 업무상 반영됐어야 할 변경 하나가 없어져 버린다. |
| 읽기-쓰기 읽는 사이 다른 쪽이 변경 | 커밋되지 않은 값을 먼저 읽는다 나중에 롤백될 수도 있는 임시 상태를 본다. balance=120 읽음 → 이후 ROLLBACK | 오손 읽기 dirty read |
잘못된 데이터 존재하지 않을 값을 기준으로 검증이나 계산을 하게 된다. |
| 같은 행을 다시 읽자 값이 달라진다 사이사이에 다른 트랜잭션의 커밋이 끼어든다. 1회 조회 100 → 2회 조회 120 | 반복불가 읽기 non-repeatable read |
일관성 위반 한 트랜잭션 안에서도 같은 행의 판단 기준이 바뀐다. |
|
| 같은 조건 재조회에서 결과 행 집합이 달라진다 INSERT 또는 DELETE 때문에 범위 자체가 바뀐다. WHERE grade='A' : 3행 → 4행 | 팬텀 phantom read |
결과셋 변화 집계, 개수 확인, 범위 검증처럼 행 집합을 다루는 로직이 흔들린다. |