본문 바로가기
Database

[Database] - 동시성 제어란?

by nam_ji 2024. 3. 13.

동시성 제어란?

동시성 제어

  • 동시성 제어란 DBMS가 다수의 사용자 사이에서 동시에 작용하는 다중 트랜잭션의 상호간섭 작용에서 Database를 보호하는 것을 의미합니다.
  • 일반적인 애플리케이션은 다수의 사용자의 요청을 처리하고 이러한 요청에는 DB 접근을 필요로 하는 요청도 포함합니다.
  • 이때 한번에 다수의 DB 접근을 필요로 하는 요청이 들어올 때 트랜잭션 단위로 DB 접근을 하게되는데 DB 접근을 동시적으로 모두 허용해주면 데이터베이스의 일관성과 무결성이 깨지게 됩니다.
  • 이를 방지하기 위해 동시성 제어를 통해 데이터베이스를 보호할 수 있습니다.
  • 동시성 제어는 병행 제어라고도 불리며 한 번에 들어온 복수의 트랜잭션을 직렬화 하는 수행을 보장합니다.
  • 이 개념에서 동시성과 대조되는 것이 일관성인데, 동시성이 높을수록 (여러 트랜잭션이 동시에 DB 접근이 가능할수록) 데이터베이스의 일관성이 깨지게 됩니다.
  • 따라서 둘은 반비례 관계입니다.
  • 다수의 사용자의 동시 접속을 위해 DBMS는 동시성 제어를 할 수 있도록 다양한 기법을 제공합니다.

동시성 제어 기법 종류

  • 동시성 제어 기법 설명
    로깅 기법 트랜잭션이 데이터에 잠금(Lock)을 설정하면 다른 트랜잭션은 해당 데이터에 대한 잠금이 해제(UnLock)될 때까지 접근 / 수정 / 삭제가 불가능합니다.
    타임 스탬프 기법 시스템에서 생성하는 고유 식별자인 타임 스탬프를 트랜잭션에 부여함으로써 트랜잭션 간의 접근 순서를 미리 정합니다.
    적합성 검증 (낙관적) 먼저 트랜잭션을 수행하고 종료할 때 적합성을 검증하여 데이터베이스에 최종 반영합니다.
    MVCC(다중 버전 동시성 제어 기법) 동시 접근을 허용하는 데이터베이스에서 동시성을 제어하기 위해 사용하는 방법 중 하나입니다.

1)로깅 기법

  • 트랜잭션이 사용하는 데이터 자원에 대하여 상호 배제(Mutual Exclusive) 기능을 제공하는 기법입니다
  • 상호 배제는 트랜잭션이 데이터 항목에 대하여 잠금(Lock)을 설정한 트랜잭션이 해제(UnLock)할 때까지 데이터를 독점적으로 사용할 수 있는 것을 의미합니다.
  • 종류 주요 개념
    공유 Lock (Shared Lock) 공유 잠금한 트랜잭션이 데이터 항목에 대하여 읽기(Read)만 가능합니다.
    다른 트랜잭션도 읽기(Read)만을 실행할 수 있는 형태입니다.
    전용 Lock (Exclusive Lock) 전용 잠금한 트랜잭션은 데이터 항목에 대하여 읽기(Read)와 기록(Write) 모두 가능합니다.
    다른 트랜잭션은 읽기(Read)와 기록(Write) 모두 할 수 없습니다.
  • 로깅 기법의 허점
    • 락을 걸거나 해제하는 시점에 제한을 두지 않으면 두 개의 트랜잭션이 동시에 실행될 때 데이터의 일관성이 깨질 수 있습니다.
    • 즉, 중간에 락의 적용이 되지 않음으로 허점이 생깁니다.
  • 블로킹(Blocking) 현상
    • 블로킹이란 Lock 간 경합이 발생하여 특정 트랜잭션 작업을 진행하지 못하고 멈춰선 상태를 말합니다.
    • 앞서 설명한 공유 Lock은 공유 Lock끼리는 서로 특정 데이터에 대한 동시 접근이 가능하기 때문에 블로킹이 발생하지 않지만, 공유 Lock - 전용 Lock 혹은 전용 Lock - 공유 Lock끼리는 블로킹이 발생합니다.
    • 이러한 현상은 애플리케이션 성능에 좋지 않은 영향을 끼치기 때문에 블로킹을 최소화 해야합니다.
      • 트랜잭션 A와 트랜잭션 B가 전용 락을 통해 2번째 로우에 있는 YKH 데이터에 접근한다고 가정했을 때
        이때 전용 락끼리는 동시 접근(공유)가 불가능하기에 경합이 발생합니다.
    • 블로킹 해결 방법
      1. 한 트랜잭션의 길이를 너무 길게 설계하는 것은 블로킹의 확률을 증가시키므로 가능한 짧게 설계합니다.
      2. 설계 시, 같은 데이터를 동시에 갱신하는 트랜잭션을 수행하지 않도록 합니다.
      3. 트랜잭션 격리성 수준을 불필요하게 상향 조정하지 않습니다.
      4. 쿼리를 너무 오랜 시간 동안 잡아두지 않도록 적절한 튜닝을 진행합니다.
  • 교착 상태 (DeadLock)
    • 교착 상태란 두 트랜잭션이 각각 Lock을 설정하고 서로의 Lock에 접근하여 값을 얻어오려 할 때 이미 각 트랜잭션에 의해 Lock이 설정되어 있기 때문에 트랜잭션이 영원히 처리되지 않게 되는 상태를 말합니다.
    • 앞에서 알아본 것처럼 두 트랜잭션이 공유락을 사용한다면 교착 상태는 발생하지 않습니다.
    • 하지만 그 외 경우에는 주의해서 설계 해야합니다.
      • game_master, game_detail 테이블이 있습니다.
      • 트랜잭션 A가 game_master 테이블에 5번 Row를 수정했고 이제 game_detail 테이블에 5번 Row를 이어서 수정하려고 합니다.
      • 동시에 트랜잭션 B는 game_detail 테이블의 5번 Row를 수정하고 이어서 game_master 테이블의 5번 Row를 수정하려고 합니다.
      • 이 경우 트랜잭션 A는 game_master 테이블의 5번 Row에 전용 락을 설정했고 트랜잭션 B는 game_detail 테이블의 5번 Row에 전용 락을 설정하였습니다.
      • 그리고 교차로 트랜잭션 A는 game_detail의 5번 Row의 Lock 설정을 하려고 하고 트랜잭션 B는 game_master의 5번 Row에 Lock 설정을 하려고 합니다.
      • 하지만 이미 각 Row들은 서로 다른 트랜잭션에 의해서 전용 락이 걸려 있습니다.
      • 따라서 Lock이 해제되기를 서로 기다립니다.
      • 하지만 이 Lock은 풀리지 않을 서로의 트랜잭션을 기다리므로 영원히 풀리지 않을 것입니다.

2) 타임 스탬프 (Time Stamp)

  • 트랜잭션의 순서대로 시간 스탬프를 지정하여 동시성 제어의 기준으로 사용되는 개념입니다.
  • 타임 스탬프에는 System 시계 사용법과 논리적인 계수기 사용법이 있습니다.
  • 구분 내용
    System 시계 사용법 트랜잭션이 시스템에 들어올 때의 System Clock 적용합니다.
    논리적인 계수기 사용법 트랜잭션의 시간 스탬프는 그 트랜잭션이 시스템에 들어올 때의 시스템 계수기의 값과 같은 개념입니다.

3) 적합성 검증 (낙관적 검증 기법)

  • 트랜잭션이 어떠한 검증도 수행하지 않고, 일단 트랜잭션을 수행하고 종료시 검증을 수행하여 데이터베이스에 반영하는 방법입니다.
  • 만약 트랜잭션의 길이가 길어 장기적으로 트랜잭션이 진행 되었는데 Roll Back 되는 경우 자원 낭비입니다.
  • 동시 사용 빈도가 낮은 시스템에서 사용합니다.

4) MVCC (다중 버전 동시성 제어 기법)

  • MVCC (Multi Version Concurreny Control)는 동시 접근을 허용하는 데이터베이스에서 동시성을 제어하기 위해 사용하는 방법 중 하나입니다.
  • 데이터에 접근하는 사용자는 접근하는 시점에서 데이터베이스 snapshot을 읽습니다.
  • 이 snapshot 데이터에 대한 변경이 완료(commit)될 때까지의 변경사항은 다른 데이터베이스 사용자가 볼 수 없습니다.
  • 이후에 사용자가 업데이트하면 이전의 데이터를 덮어 씌우는 것이 아니라 새로운 버전의 데이터를 UNDO 영역에 생성합니다.
  • 대신 이전 버전의 데이터와 비교해서 변경된 내용을 기록합니다.
  • 이렇게 여러 버전의 데이터를 가지며 현재 실행하고 있는 스케쥴의 직렬 가능성이 보장되는 적절한 버전을 선택하여 접근하도록 하는 기법을 MVCC라고 합니다.
  • MVCC 접근 방식은 트랜잭션의 대기 시간이 존재하지 않음으로 빠르게 동작할 수 있습니다.
    또한 데이터를 읽기 시작할 때, 다른 트랜잭션이 그 데이터를 삭제하거나 수정해도 영향을 받지 않고 조회 가능합니다.

정리

기법 이름 장점 단점
Locking 기법 1. 데이터 오류 가능성 사전에 예방할 수 있습니다.
2. 구현하기 쉽습니다.
1. Lock 대기 시간 -> 동시성 저하됩니다.
2. 교착 상태 (DeadLock) 발생 가능성이 존재합니다.
TimeStamp 1. 교착 상태 (DeadLock) 발생 가능성이 없습니다.
2. 트랜잭션 대기 시간이 없습니다.
1. RollBack 발생 확률이 높습니다.
적합성 검사 (낙관적) 1. 동시 처리 능력이 증가합니다.
2. 트랜잭션 대기 시간이 없습니다.
1. 장기 트랜잭션 철회시 자원이 낭비됩니다.
MVCC 1. 트랜잭션 대기 시간이 없습니다.
2. 다른 트랜잭션이 해당 데이터를 수정해도 영향을 받지 않습니다.
1. 사용하지 않는 데이터를 정리하는 시스템이 필요합니다.
2. 데이터 버전의 충돌이 일어날 수 있습니다.
3. UNDO 블록, I/O 등의 부가적인 오버헤드가 발생합니다.

동시성 제어를 하지 않는 경우 발생할 수 있는 문제점

문제점 내용
갱신 손실 트랜잭션이 동일 데이터를 동시에 갱신할 경우 발생하며 특정 트랜잭션의 갱신 내용이 반영되지 않는 오류입니다.
현황 파악 오류 (Dirty Read) 트랜잭션 과정에서 갱신을 하고 트랜잭션 종료하기 전에 다른 트랜잭션이 참조함으로써 조회 결과의 정확성이 깨지는 오류입니다.
모순성 두 트랜잭션이 동시에 실행될 때 DB가 일관성이 없는 상태로 남는 오류입니다.
연쇄 복귀 복수의 트랜잭션이 동일한 데이터 공유시 특정 트랜잭션이 처리를 취소할 경우 다른 트랜잭션은 해당 취소를 적용하지 못하는 오류입니다.