Database 동시성제어

정찬's avatar
Oct 13, 2024
Database 동시성제어
 
 

직렬가능성

 

직렬 가능 스케줄

 
 
  • 트랜잭션이 동시에 실행되더라도 결과가 순차적으로 실행된 것과 동일한 경우
  • 나는 직렬이란 것은 순차적으로, 병렬은 여러개가 동시에 실행된다는 개념을 갖고 있었다. 그래서 직렬 가능 스케줄이란 의미는 ‘순차적으로 실행되어야 하는 스케줄’ 이라고 오인했었다. 직렬 가능 스케줄이라는 것은 병렬적으로 실행해도 순차적으로 실행한것과 결과가 같은 스케줄을 의미한다.

Lock

 
  • 직렬성을 보장하기 위한 방법으로, 데이터 객체들이 상호 배타적으로 엑세스 되도록 함
  • 한 트랜잭션이 한 데이터 객체에 액세스 했을 때 다른 트랜잭션이 해당 객체를 수정하지 못하도록 함
  • 다중 트랜잭션 환경에서 데이터베이스의 일관성과 무결성을 유지하기 위한 순차적 진행을 보장한다
 

Lock Mode

 
  1. Shared Lock Mode
    1. Shared Lock 또는 Read Lock - 'S'로 표시한다.
    2. 다른 트랜잭션에서 데이터를 읽을 수 있는 잠금이다.
    3. 동일 데이터베이스 객체에 여러 Shared Lock이 동시에 적용될 수 있다.
    4. 트랜잭션 T1이 객체 A에 Shared Lock을 가지고 있으면, 다른 트랜잭션도 Shared Lock을 획득할 수 있다.
    5. 그러나 트랜잭션 T1이 객체 A에 Shared Lock을 가지고 있으면, 다른 트랜잭션의 Exclusive Lock은 허용되지 않는다.
    6. 주로 Select 쿼리에 적용된다.
  1. Exclusive Lock Mode
    1. Write Lock - X 로 표시한다.
    2. 다른 트랜잭션에서 데이터를 읽을 수도, 쓸 수도 없는 잠금 모드이다.
    3. 다른 트랜잭션의 접근을 허용하지 않는다.
    4. 트랜잭션 T1이 객체 A에 Exclusive Lock을 가지고 있을 경우, 다른 트랜잭션에서 Shared Lock, Exclusive Lock을 가질 수 없다.
    5. Update Delete Insert 등의 갱신 쿼리에 적용된다.
  1. Strict 2 Phase Lock
    1. 가장 널리 사용되는 잠금 규약으로, 두 가지 규칙을 사용한다.
      1. 트랜잭션 T가 어떤 객체를 판독하려면, 그 객체에 대해 공유 잠금을 요청한다.
      2. 트랜잭션이 종료될 때 가지고 있던 모든 잠금을 풀어준다.
    2. 잠금 규약은 안전한 인터리빙만을 허용한다.
      1. 두 트랜잭션이 동일한 객체에 접근하며, 한 트랜잭션이 객체를 수정하려 . 할때, 단위 작업이 직렬 순서로 수행된 효과를 얻도록 한다.
 

잠금 기반 병행 제어

 

잠금 관리

 
DBMS는 잠금 관리자를 제공한다.
잠금 관리자는 잠금 테이블과 트랜잭션 테이블을 유지한다.
잠금 테이블 엔트리로 객체에 대한 잠금 정보를 관리한다.
 

교착상태

 
두 트랜잭션이 잠금 해제를 기다리는 관계에 사이클이 생기는 경우
논리적으로 교착상태를 막을 수 있는 방법은 없다.
예방으로 프로세스의 시작을 막거나, 탐지로 교착상태를 검출하여 프로세스를 죽이는 방법을 사용한다.
 

교착상태 예방

 
트랜잭션마다 우선순위를 부여해주고 우선 순위가 낮은 트랜잭션은 우선순위가 높은 트랜잭션을 기다릴 수 없도록 하여 예방한다.
 
우선 순위 지정에는 타임 스탬프를 사용하여 가장 오래된 트랜잭션이 가장 높은 우선순위를 가질 수 있도록 한다.
 

트랜잭션 격리 수준

 

Level 0 : READ UNCOMMITED

 
  • 트랜잭션 T는 진행중인 트랜잭션이 만들어 놓은 변경도 판독할 수 있다
 

Level 1 : READ COMMITED

 
  • 트랜잭션 T는 완결된트랜잭션들이 만들어 놓은 변경만 판독할 수 있다.
  • T가 판독하거나 기록한 값은 T가 종료된 후에 변경할 수 있으나, T가 판독한 Row는 다른 트랜잭션이 접근가능
 

Level 2 : REPEATABLE READ

 
  • 트랜잭션 T는 완결된 트랜잭션들이 만들어 놓은 변경만 판독할 수 있다.
    • 다른 트랜젹신이 읽고 있는 데이터는 다른 트랜잭션에서 수정/삭제/삽입 불가능
    • Phantom Read 발생
      • T1이 데이터를 읽었음
      • T1 트랜잭션이 끝나지 않은 시점에서 T2가 데이터를 추가
      • T1이 똑같은 SELECT 문을 사용하여 조회하면 T2가 추가한 데이터가 보임(팬텀 데이터)
  • T가 판독하거나 기록한 값은 T가 종료된 후에 변경할 수 있으나, Index Locking은 하지 않는다.
    • REPEATABLE READ는 개별 행의 읽기 일관성을 보장하지만, 범위 내의 데이터를 추가하거나 삭제하는 상황은 막지 않는다.
 

Level 3 : SERIALIZABLE

 
  • T가 판독하거나 기록한 값은 T가 종료된 후에 변경할 수 있다.
    • 다른 트랜잭션이 읽고 있는 데이터는 다른 트랜잭션에서 수정/삭제/삽입불가능
    • 모든 이상현상 방지
 
 
notion image
 
Share article

lushlife99