데이터베이스 기초

트랜잭션의 동시성 제어에 사용되는 2단계 로킹 방식에 대한 설명으로 올바른 것은?

  1. A각 트랜잭션은 락을 거는 단계와 해제하는 단계를 몇 번 반복해도 된다. 이로써 데드락이 일어나지 않음이 보장된다
  2. B읽기에는 락을 걸지 않고 쓰기에만 락을 건다. 이로써 더티 리드를 포함한 모든 문제를 막을 수 있다
  3. C각 트랜잭션은 락을 하나라도 해제하면 그 이후에는 새로운 락을 걸지 않는다. 이로써 동시에 실행해도 직렬로 실행한 경우와 같은 결과가 됨이 보장되지만, 데드락은 일어날 수 있다
정답과 해설 보기

정답: C. 각 트랜잭션은 락을 하나라도 해제하면 그 이후에는 새로운 락을 걸지 않는다. 이로써 동시에 실행해도 직렬로 실행한 경우와 같은 결과가 됨이 보장되지만, 데드락은 일어날 수 있다

2단계 로킹 방식(2PL)에서는 각 트랜잭션이 필요한 락을 차례로 걸어 가는 단계(확장 단계)와 락을 해제해 가는 단계(축소 단계)의 두 단계를 가지며, 일단 락을 해제하기 시작하면 새로운 락은 걸지 않습니다. 모든 트랜잭션이 이 규칙을 지키면, 동시에 실행했을 때의 결과가 트랜잭션을 어떤 순서로 하나씩 실행한 경우와 같아지는 것(직렬 가능성)이 보장됩니다. 다만 두 트랜잭션이 서로 상대의 락 해제를 기다리는 데드락은 막을 수 없으므로, DBMS는 데드락을 감지하여 한쪽을 롤백하는 등의 대처를 합니다. 실제로는 커밋할 때까지 배타 락을 해제하지 않는 엄격한 2단계 로킹 방식이 자주 사용되며, 다른 트랜잭션이 커밋되지 않은 데이터를 읽는 것도 막습니다.

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

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

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