Skip to content
난이도 문제은행 5

동시성 제어: 로킹·타임스탬프 ​

동시성 제어(concurrency control)는 여러 트랜잭션(transaction)이 같은 데이터를 동시에 다룰 때 결과가 틀어지지 않게 실행 순서를 조절하는 일이다. 병행 제어라고도 한다. 실기 시험은 로킹의 정의, 2단계 로킹 규약(two-phase locking protocol)의 두 단계, 타임스탬프(timestamp) 순서(timestamp ordering) 기법, 로킹 단위(locking granularity)와 병행성의 관계를 묻는다.

왜 필요한가 ​

두 트랜잭션이 같은 잔액을 동시에 읽고 각자 고쳐 쓰면 한쪽의 변경이 사라진다. 이를 갱신 분실(lost update)이라 한다. 다른 트랜잭션이 아직 커밋(commit)하지 않은 값을 읽었다가 그 트랜잭션이 롤백(rollback)되는 문제도 있다. 동시성 제어는 트랜잭션들을 동시에 돌리면서도 결과가 어떤 순서로 하나씩 실행한 것과 같게 만든다. 이 성질을 직렬 가능성(serializability)이라 한다. 그래서 데이터 일관성을 지키면서 처리량도 얻을 수 있다.

로킹 ​

로킹(locking)은 트랜잭션이 데이터에 접근하기 전에 잠금(lock)을 요청하고, 잠금을 얻어야만 접근하게 하는 기법이다. 다른 트랜잭션이 이미 잠근 데이터는 풀릴 때까지 기다린다. 이렇게 주요 데이터 접근을 상호 배타적으로 만든다.

잠금만 쓴다고 직렬 가능성이 보장되지는 않는다. 잠금을 너무 일찍 풀면 그 사이에 다른 트랜잭션이 끼어들 수 있기 때문이다. 2단계 로킹 규약(two-phase locking protocol)은 잠금을 얻고 푸는 시기를 두 단계로 나눠 이 문제를 막는다.

단계규칙
확장 단계새 잠금을 얻을 수만 있고 풀 수는 없다
축소 단계잠금을 풀 수만 있고 새로 얻을 수는 없다

한 번이라도 잠금을 풀면 그 뒤로는 새 잠금을 얻지 못한다. 이 규약을 지키면 직렬 가능성이 보장된다. 하지만 서로 상대의 잠금을 기다리는 교착 상태(deadlock)는 막지 못한다.

로킹 단위 ​

로킹 단위(locking granularity)는 한 번에 잠그는 대상의 크기다. 데이터베이스, 파일, 레코드, 필드가 모두 단위가 될 수 있다. 단위를 크게 잡으면 관리할 잠금 수가 적어 간단하지만, 상관없는 데이터까지 잠겨 동시에 처리할 수 있는 양이 줄어든다.

로킹 단위잠금 수관리 부담병행성
크다적다작다낮다
작다많다크다높다

타임스탬프 순서 ​

타임스탬프 순서(timestamp ordering)는 잠금 대신 트랜잭션이 시작할 때 고유한 타임스탬프(timestamp)를 붙이고, 그 시간 순서대로 작업하게 하는 기법이다. 데이터마다 마지막으로 읽고 쓴 트랜잭션의 타임스탬프를 기록해 둔다. 늦게 시작한 트랜잭션이 이미 읽거나 쓴 데이터를 먼저 시작한 트랜잭션이 쓰려 하면 순서가 어긋난 것이므로 그 트랜잭션을 취소하고 다시 시작한다. 기본 타임스탬프 순서 기법은 기다리지 않고 취소하므로 로킹에서 생기는 교착 상태가 없다. 직렬 가능 순서를 미리 정하는 기법 중 대표적이다.

그 밖에 다중 버전 동시성 제어(MVCC, Multi-Version Concurrency Control)는 값을 여러 버전으로 두어 읽기가 쓰기를 기다리지 않게 한다. 낙관적 검증(optimistic validation)은 일단 실행하고 끝날 때 충돌을 검사한다.

시험 포인트 ​

  • "접근 전에 잠금을 요청하고 허락되어야만 접근" → 로킹.
  • 2단계 로킹: 확장 단계(획득만), 축소 단계(해제만). 직렬 가능성 보장, 교착 상태는 못 막음.
  • "트랜잭션 시작 전에 타임스탬프를 부여하고 그 순서대로 수행" → 타임스탬프 순서.
  • 로킹 단위가 크면 잠금 수 적고 관리 쉬우나 병행성 낮다. 작으면 반대.

관련 문서