데이터베이스 기초

트랜잭션 T1은 행 A에 배타 락을 건 뒤 행 B의 락을 요구하고, T2는 행 B에 배타 락을 건 뒤 행 A의 락을 요구했기 때문에 둘 다 앞으로 나아갈 수 없게 되었다. DBMS가 이 상태를 감지했을 때 하는 일반적인 대처는?

  1. A그대로 계속 기다리게 한다. 언젠가 한쪽의 락이 자연히 해제된다
  2. B한쪽 트랜잭션을 롤백하여 락을 해제하게 하고, 다른 쪽을 진행시킨다
  3. CT1과 T2의 갱신을 둘 다 그대로 커밋한다
정답과 해설 보기

정답: B. 한쪽 트랜잭션을 롤백하여 락을 해제하게 하고, 다른 쪽을 진행시킨다

둘 이상의 트랜잭션이 서로 상대가 가진 락의 해제를 기다려 어느 것도 앞으로 나아갈 수 없게 되는 상태를 데드락(교착 상태)이라고 합니다. 이 상태는 기다리기만 해서는 해소되지 않으므로, 많은 DBMS는 어느 트랜잭션이 어느 것을 기다리는지를 나타내는 대기 그래프에 사이클이 생긴 것 등으로 데드락을 감지하고, 한쪽(희생자)을 롤백하여 락을 해제하게 합니다. 롤백된 트랜잭션은 나중에 다시 실행합니다. 락을 기다리는 시간에 상한(타임아웃)을 두어, 넘으면 롤백하는 방법도 있습니다. 예방책으로는 모든 트랜잭션이 행 A 다음에 행 B처럼 정해진 순서로 락을 걸도록 하는 방법이 효과적입니다.

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

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

  1. 많은 DBMS는 데이터를 갱신할 때 갱신 내용을 로그(저널)에 기록하고, 그 로그를 데이터베이스 본체보다 먼저 비휘발성 저장 장치에 쓴다(WAL: 로그 선행 기록). 이 방식을 취하는 주된 이유는?
  2. 트랜잭션 T1~T5가 있고, 장애가 발생하기 전에 체크포인트를 한 번 잡았다. T1은 체크포인트 전에 시작하여 커밋했다. T2와 T3는 체크포인트 전에 시작했으며, T2는 체크포인트 후 장애 전에 커밋했고, T3는 장애 시점에 커밋하지 않았다. T4와 T5는 체크포인트 후에 시작했으며, T4는 장애 전에 커밋했고, T5는 커밋하지 않았다. 장애 후의 복구에서 로그를 사용하여 롤포워드해야 하는 트랜잭션은?
  3. 100만 행이 있는 회원 표의 회원번호 열에 B+ 트리 인덱스를 만들었다. 일반적으로 기대할 수 있는 효과와 그 대가의 조합으로 올바른 것은?
  4. 100만 행의 회원 표에서 회원번호(모두 다름), 도도부현(47종류), 성별(2종류로 거의 반반) 열에 각각 B+ 트리 인덱스를 만드는 것을 생각한다. WHERE 절로 한 열의 값을 지정하여 검색할 때 인덱스의 효과가 가장 작다고 생각되는 열은?
  5. NoSQL이라고 불리는 데이터베이스 중 키-값형의 특징으로 일반적으로 올바른 것은?