데이터베이스 기초

재고 표에서 어떤 상품의 재고 수는 10이다. 트랜잭션 T1은 재고 수를 읽어 3을 뺀 값을 쓰고, T2는 재고 수를 읽어 5를 뺀 값을 쓴다. 락을 걸지 않고 T1의 읽기, T2의 읽기, T1의 쓰기, T2의 쓰기 순서로 실행되었을 때 최종 재고 수는 얼마가 되는가?

  1. A2
  2. B5
  3. 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 문으로 수행합니다.

이 분야 연습하기 분야로 돌아가기

데이터베이스 기초의 다른 문제

  1. 트랜잭션을 동시에 실행했을 때 일어나는 문제 중 더티 리드에 대한 설명으로 올바른 것은?
  2. 트랜잭션 T1이 SELECT COUNT(*) FROM 주문 WHERE 금액 >= 1000을 실행했더니 8건이었다. 그 직후 T2가 금액 2000인 주문 행을 INSERT하고 커밋했다. T1이 같은 SELECT 문을 다시 실행하자 9건이 되었다. 이 현상은?
  3. SQL 표준 규격이 정하는 격리 수준 중 READ COMMITTED에서 일어날 수 있는 현상의 조합으로 올바른 것은?
  4. 트랜잭션 T1이 어떤 행에 공유 락을 걸고 읽고 있다. 이 행에 대해 T2가 공유 락을, T3가 배타 락을 요구했다. T1이 락을 해제할 때까지의 동안에 대해 올바른 것은?
  5. 트랜잭션의 동시성 제어에 사용되는 2단계 로킹 방식에 대한 설명으로 올바른 것은?