데이터베이스 기초
재고 표에서 어떤 상품의 재고 수는 10이다. 트랜잭션 T1은 재고 수를 읽어 3을 뺀 값을 쓰고, T2는 재고 수를 읽어 5를 뺀 값을 쓴다. 락을 걸지 않고 T1의 읽기, T2의 읽기, T1의 쓰기, T2의 쓰기 순서로 실행되었을 때 최종 재고 수는 얼마가 되는가?
- A2
- B5
- C7
정답과 해설 보기
정답: B. 5
T1과 T2는 둘 다 상대가 쓰기 전의 재고 수 10을 읽습니다. T1은 10 − 3 = 7을 쓰지만, 그 뒤 T2가 자신이 읽은 10을 바탕으로 계산한 10 − 5 = 5로 덮어쓰므로 최종 재고 수는 5가 됩니다. 원래는 두 처리를 차례로 수행한 10 − 3 − 5 = 2가 되어야 하며, T1의 갱신이 사라졌습니다. 이를 갱신 손실(로스트 업데이트)이라고 합니다. 막으려면 읽을 때 배타 락을 걸어 T1이 끝날 때까지 T2의 읽기를 기다리게 하거나(SELECT … FOR UPDATE 등), UPDATE 재고 SET 재고수 = 재고수 - 3처럼 읽기와 쓰기를 하나의 SQL 문으로 수행합니다.