Post

Database - Concurrency control - Locking

Locking

1. 개요

공유 자원의 접근 순서나 한번에 접근하는 수를 제한하기 위한 방법이다.
운영체제에서 멀티 스레드간 자원 동기화할때도 자주 쓰는 방법이기 때문에 새로울건 없다.

기본적인 Lock 타입은 총 두 가지이다.

  • S-Lock : Shared lock의 줄임말로 읽을때 걸어두는 Lock이다.
  • X-Lock : Exclusive Lock의 줄임말로 쓸때 걸어두는 Lock이다.

S-Lock이 걸려있으면 다른 주체의 Read를 위해서는 접근할 수 있는데 반해 Write는 할 수 없고 X-Lock이 걸려있으면 다른 주체의 Read든 Write든 모두 접근 할 수 없다.

2. Two-Phase Locking

1) 사용 시점

기본 Locking 방식에서 좀 더 진보된 형태의 Locking 방식으로 아래와 같은 상황에서 사용한다.

  • 트랜잭션 간 동시성 제어가 필요한 경우
  • 여러 사용자 또는 애플리케이션이 동시에 데이터베이스에 액세스하고 조작하며 데이터 무결성을 유지해야 할 때 사용
  • 직렬성을 보장해야 하는 경우
  • 시스템이 트랜잭션이 순차적으로, 즉 순차적으로 실행되는 것처럼 보이도록 해야 할 때 (데이터 베이스 일관성 유지)
  • 읽기/쓰기 충돌을 방지하여 트랜잭션 간의 부작용을 방지해야할 때

2) 사용 방식

Two-Phase라는 이름 답게 2단계로 나뉜다.

Phase 1 : Growing

각 트랜잭션은 각 자원에 대해서 lock을 받아오는 것만 가능하다.

Phase 2 : Shrinking

각 트랜잭션은 각 자원에 대해서 lock을 반납하는것만 가능하다.

예시

아래는 트랜잭션 한 개의 예시이다.

img.png

위와 같이 한번에 Growing Phase가 지나면 unlock만 가능하고, Shrinking Phase가 끝나면 해당 트랜잭션이 끝나게 하는 것이다.

문제점

  • 불필요한 대기와 빠른 lock
    lock 대기 시간이 길어져서 성능 저하가 일어날 수 있다.

  • Deadlock
    lock을 잡고 있기 때문에 Deadlock이 발생할 수 있다.

  • Cascading Rollback
    하나의 롤백이 다른 Rollback을 언쇄적으로 불러 일으킬 수 있다.

3. Conservative Two-Phase Locking Protocol

Growing Phase가 없이 Transaction 시작전에 필요한 lock을 모두 받아두고, 처리한 뒤에 락을 푸는 것이다.

  • 데드락이 발생하지 않는다. (한번에 필요한 락을 모두 챙기기 때문이다)
  • 하지만 구현이 어렵다 -> 어떤 자원이 어떤 락이 필요한지 미리 판단해야하기 때문이다. (사실상 불가능하다)
  • 여전히 Cascading Rollback은 일어날 수 있다.

4. Strict Two-Phase Locking Protocol

모든 X-lock은 트랜잭션이 커밋되거나 중단될때까지 유지되지만 S-lock은 commit이나 abort 되기 전에 unlock 된다.

  • 격리성이 강하다.
  • 동시성 또한 높다.
  • 셧다운시 복구 가능성이 있다.
  • Cascading Rollback은 방지된다.
  • Deadlock 발생 가능성은 여전히 존재한다.

5. Rigorous Two-Phase Locking Protocol

모든 S-lock과 X-lock은 트랜잭션이 커밋되거나 중단될때까지 유지된다.

  • 격리성이 제일 강하다.
  • 동시성은 낮다. (S-lock까지 잡고 있으므로)
  • 셧다운시 복구가능성이 훨씬 크다.
  • Cascading Rollback은 방지된다.
  • Deadlock 발생 가능성은 여전히 존재한다.

※ 추가 업데이트 및 검증 예정이고, 아직 완벽하지 않으니 참고만 바란다.

참고자료

  • 서강대학교 김영재 교수님 고급데이터 베이스 강의 자료
This post is licensed under CC BY 4.0 by the author.