데이터베이스 동시성 제어

배채윤·2022년 5월 2일
0
post-thumbnail

동시성 제어란?(Concurrency Control)

  • DBMS가 다수의 사용자 사이에서 동시에 작용하는
    다중 트랜잭션의 상호간섭 작용에서 Database를 보호하는 것.
  • 트랜잭션의 직렬화 수행을 보장한다.
  • 일반적으로 동시성을 허용하면 일관성이 낮아지는 반비례 관계를 가짐.

동시성 제어기법의 종류

제어기법내용
Shared Lock데이터 항목에 대해 Read만 가능
Exclusive Lock데이터 항목에 대해 Read/Write 모두 불가능
2 Phase Locking모든 트랜잭션이 lock과 unlock 연산을
확장 단계와 수축 단계로 구분하여 수행
Timestamp OrderingDB 시스템에 들어오는 트랜잭션 순서대로 System Clock / Logical Counter
할당하고 순서를 부여하여 동시성 제어의 기준으로 사용
Validation(낙관적 검증)트랜잭션 수행 동안은 어떠한 검사도 하지 않고, 트랜잭션 종료 시 일괄적 검사 기법
MVCC트랜잭션의 타임스탬프와 접근 데이터의 여러 버전 타임스탬프를
비교하여 직렬 가능성이 보장되는 버전을 선택

1. Pessimistic Concurrency Control(비관적 동시성 제어)

  • 사용자들이 같은 데이터를 동시에 수정한다고 가정
  • 데이터를 읽는 시점에 Lock을 걸고 Trasaction이 완료될 때까지 유지
  • SELECT 시점에 Lock을 거는 비관적 동시성 제어는 시스템의 동시성을 심각하게 떨어뜨릴 수 있기 때문에 WAIT or NOWAIT 옵션과 함께 사용

2. Optimistic Concurrency Control(낙관적 동시성 제어)

  • 사용자들이 같은 데이터를 동시에 수정하지 않을 것이라 가정
  • 데이터를 읽는 시점에 Lock을 걸지 않는 대신 수정 시점에 값이 변경됐는지를 반드시 검사

Locking 기법

  • 하나의 트랜잭션이 실행하는 동안 특정 데이터 항목에 대해서 다른 트랜잭션이 동시에 접근하지 못하도록 상호배게(Mutual Exclusive) 기능을 제공하는 기법.
  • 하나의 트랜잭션이 데이터 항목에 대해 Lock을 설정하면 트랜잭션이 unlock할 때까지 데이터 독점 사용이 가능하다.

한계: 교착상태
항상 직렬 가능한 스케줄을 보장하진 못하기 때문

두 트랜잭션이 각자 특정 자원에 대해서 Lock을 건 상태에서 서로 가지고 있는 자원을 요청했을 때.
서로의 트랜잭션이 unlock될 때까지 무한대기 상태에 빠진다.

2-Phase Locking

  • 확장 단계(Growing Phase): 트랜잭션이 lock 연산을 수행할 수 있고 unlock 연산을 수행할 수 없는 단계
  • 축소 단계(Shrinking Phase): 트랜잭션이 unlock 연산만을 수행할 수 있고 lock 연산은 수행할 수 없는 단계


MVCC?

  • Multi Version Concurrency Control. 다중 버전 동시성 제어
  • 동시 접근을 허용하는 데이터 베이스에서 동시성을 제어하기 위해 사용하는 모델
  • 가장 큰 목적은 잠금을 사용하지 않는 일관된 읽기를 제공하는 데 있다.

처리 순서

  1. 데이터에 접근하는 사용자는 접근한 시점에서 DB의 Snapshot을 읽는다.
    이 Snapshot 데이터에 대한 변경이 완료될 때(트랜잭션이 commit 될 때)까지
    만들어진 변경사항은 다른 사용자가 볼 수 없다.

  2. 사용자가 데이터 업데이트 했다면

  3. 새로운 버전의 데이터를 UNDO 영역에 생성한다.
    이전 데이터를 덮어 씌우는 게 아니라 새로운 버전 생성.
    대신 이전 버전의 데이터와 비교하여 변경 내용을 기록한다.

  4. 그 결과, 하나의 데이터에 대해 여러 개의 버전이 생기게 되고 사용자는 마지막 버전의 데이터를 읽게 된다.

장단점

  • 장점

    • 잠금을 필요로 하지 않기 때문에 일반적인 RDBMS보다 매우 빠르게 작동
    • 다른 사람이 동시간대에 데이터를 삭제하거나 수정하더라도 영향을 받지 않고 데이터 사용 가능
    • 문장수준과 트랜잭션 수준의 읽기 일관성이 존재
  • 단점

    • 사용하지 않는 데이터가 계속 쌓이게 되므로 데이터 정리 시스템이 필요
    • 데이터 버전 충돌에 대한 처리는 애플리케이션 영역에서 해결해야 한다.
    • UNDO 블록 I/O, CR Copy 생성, CR 블록 캐싱 같은 부가적인 작업에서 오버헤드가 발생.

Reference

profile
새로운 기술을 테스트하고 적용해보는 걸 좋아하는 서버 개발자

0개의 댓글