Home 동시성 제어
Post
Cancel

동시성 제어

동시성 제어(concurrency control)란?


다중 사용자 환경을 지원하는 데이터베이스 시스템에서 여러 트랜잭션들이 성공적으로 동시에 실행 될 수 있도록 지원하는 기능입니다. 이를 동시성제어 또는 병행제어 라고도 합니다.

동시성 제어의 필요성


트랜잭션이 순차적으로, 즉 시간이 겹치지 않고 순차적으로 실행된다면 동시성이 존재하지 않습니다. 하지만 다수의 사용자가 접근하는 DB의 경우 여러 트랜잭션이 하나의 데이터를 삽입, 갱신, 삭제 등의 작업을 동시에 수행하게 될 때 동시성 제어가 적절하게 설계되어있지 않다면 예기치 못한 문제점들이 발생할 수 있습니다.

동시성 제어를 하지 않는 경우 문제점


I. Dirty Write

갱신 분실(Lost Update)이라고도 합니다.

  • 두 개의 서로 다른 트랜잭션이 데이터베이스 내의 동일한 행에 있는 동일한 열을 동시에 업데이트하려고 할 때 발생

스크린샷 2021-12-23 오전 12.58.14.png

  1. T1 이 id가 1인 user를 조회
  2. T2 도 id가 1인 user를 조회
  3. T1 이 id가 1인 user의 age를 업데이트 후 커밋
  4. T2 도 id가 1인 user의 age를 업데이트 후 커밋

문제점

  1. 일반적으로 한 트랜잭션은 특정 행, 특정 열을 업데이트하는 반면, 얼마 후에 시작된 다른 트랜잭션은 동일한 값 자체를 업데이트하기 전에 이 업데이트를 인지하지 못함

  2. 첫 번째 트랜잭션의 결과가 두 번째 트랜잭션에 의해 덮어 쓰기되므로 lost 발생

II. Dirty Read

비완료 의존성(Uncommitted Dependency)이라고도 *합니다.*

  • 아직 commit되지 않은 트랜잭션의 내용을 읽으려고 함

스크린샷 2021-12-23 오전 1.01.57.png

문제점

  1. T1에서 update를 진행하였으나 commit을 하지않음
  2. T2에서 age를 20으로 read
  3. T1에서 rollback 진행 → 하지만 T2는 age를 여전히 20으로 알고있음

III. Non-repeatable Read

모순성(Inconsistency)이라고도 합니다.

  • 동일 트랜잭션에서 동일한 대상을 여러번 읽을 때 그 사이에 수정 또는 삭제가 반영되어 값이 변경됨

스크린샷 2021-12-23 오전 1.13.23.png

문제점

  1. 서로 다른 트랜잭션은 post의 id가 1인 데이터를 조회
  2. Bob은 post의 title을 ‘Transactions’로 조회하였으나
  3. Alice는 title을 ‘ACID’로 변경 후 커밋
  4. Bob은 post의 title을 ‘Transactions’로 기대하고 조회하였으나 ‘ACID’로 변경된 데이터를 확인

IV. Phantom Read

  • 동일 트랜잭션에서 동일한 대상을 여러번 읽을 때 그 사이에 새로운 값(Phantom Tuple)이 삽입되어 값이 변경됨

스크린샷 2021-12-23 오전 1.21.26.png

문제점

  1. Bob’s는 post id가 1인 게시물 행과 연결된 모든 post_comment 레코드를 읽습니다.
  2. Alice는 post id가 1인 게시물 행과 연결된 새로운 post_comment 레코드를 추가합니다.
  3. Alice는 데이터베이스 트랜잭션을 커밋합니다.
  4. Bob이 post id의 값이 1인 post_comment 레코드를 다시 읽으면 이 결과 다른버전의 post_comment 집합을 확인하게 됩니다.

동시 접근에 대해 이상현상이 생기지 않음을 보장하는 트랜잭션 고립화 수준에 관한 표준

격리 수준Dirty ReadNon-Repeatable ReadPhantom Read
Read Uncommitted (Level 0)OOO
Read Committed (Level 1)XOO
Repeatable Read (Level 2)XXO
Serializable (Level 3)XXX

문제점을 해결하기 위해

위에서 살펴본 문제점을 해결하기 위해 어떠한 방법들이 있을까요?

다중 사용자 환경을 지원하는 데이터베이스는 동시성 제어를 위한 여러가지 기법들을 제시하고 있습니다.

로킹 (Locking) 기법

잠금 기법은 기본적으로 lock 연산과 unlock 연산을 사용합니다.

스크린샷 2021-12-28 오전 1.20.34.png

  1. 트랜잭션이 어떤 데이터에 접근하고자 할 때 로킹 수행
  2. 로킹이 되어 있는 데이터에는 다른 트랜잭션이 접근할 수 없음
  3. 트랜잭션은 로킹이 된 데이터에 대해서만 연산 수행

스크린샷 2021-12-28 오전 1.24.02.png

잠금(Locking)은 하나의 트랜잭션이 실행하는 동안 특정 데이터 항목에 대해서 다른 트랜잭션이 동시에 접근하지 못하도록 상호배제(Mutual Exclusive) 기능을 제공하는 기법입니다. 하나의 트랜잭션이 데이터 항목에 대하여 잠금(lock)을 설정하면, 잠금을 설정한 트랜잭션이 해제(unlock)할 때까지 데이터를 독점적으로 사용할 수 있습니다.

잠금 연산의 종류

잠금 연산은 데이터에 대한 연산의 성격에 따라 공유잠금(Shared lock: S-lock)과 배타잠금(Exclusive lock: X-lock)으로 나눌 수 있습니다.

  • S-lock(공유잠금)
    • 공유잠금을 설정한 트랜잭션은 데이터 항목에 대해 읽기 연산(read)만 가능하다.
      • ex) T1에서 x에 대해 S-lock을 설정했다면, T1은 read(x) 연산만 가능하다.
    • 하나의 데이터 항목에 대해 여러 개의 공유잠금이(S-lock) 가능하다.
      • ex) T1에서 x에 대해 S-lock을 설정한 경우, 동시에 T2에서도 x에 대해 S-lock을 설정할 수 있다.
    • 다른 트랜잭션도 읽기 연산(read) 만을 실행할 수 있다.
      • ex) T1에서 x에 대해 S-lock을 설정했다면, T2에서도 T1이 S-lock(x)을 실행하는 동안 read(x) 연산만 가능하다.
  • X-lock(배타잠금)
    • 배타잠금을 설정한 트랜잭션은 데이터 항목에 대해서 읽기 연산(read)과 쓰기 연산(write) 모두 가능하다.
      • ex) T1에서 x에 대해 S-lock을 설정했다면, T1은 read(x) 연산과 write(x) 연산 모두 가능하다.하나의 데이터 항목에 대해서는 하나의 배타잠금(X-lock)만 가능하다.
    • 동시에 여러 개의 배타잠금은 불가능하다.
      • ex) T1에서 x에 대해 X-lock을 설정했다면, T1에서 unlock(x)를 하기 전까지 T2에서 x에 대해 X-lock을 설정할 수 없다.
    • 다른 트랜잭션은 읽기 연산(read)와 쓰기 연산(write) 모두 불가능하다.
      • ex) T1에서 x에 대해 X-lock을 설정했다면, T2에서는 T1에서 unlock(x)를 하기 전까지 read(x), write(x) 연산이 모두 불가능하다.

2단계 로킹 규약(Two-Phase Locking Protocol)

  • Lock과 Unlock이 동시에 이루어지면 일관성이 보장되지 않으므로 Lock만 가능한 단계와 Unlock만 가능한 단계를 구분
  • 확장단계: 새로운 Lock은 가능하고 Unlock은 불가능하다.
  • 축소단계: Unlock 은 가능하고 새로운 Lock은 불가능하다.
  • 직렬가능성을 보장한다.
  • 교착상태가 발생할 수 있다

타임스탬프(Time Stamp)

  • 데이터에 접근하는 시간을 미리 정하여서 정해진 시간(Time Stamp)의 순서대로 데이터에 접근 하여 수행
  • 직렬가능성을 보장한다.
  • 교착상태가 발생하지 않는다.
  • 연쇄복귀(Cascading Rollback)를 초래할 수 있음

낙관적 병행제어(Optimistic Concurrency Control)

  • 트랜잭션 수행 동안은 어떠한 검사도 하지 않고, 트랜잭션 종료 시에 일괄적으로 검사
  • 트랜잭션 수행 동안 그 트랜잭션을 위해 유지되는 데이터 항목들의 지역 사본에 대해서만 갱신
  • 트랜잭션 종료 시에 동시성을 위한 트랜잭션 직렬화가 검증되면 일시에 DB로 반영

다중 버전 병행제어(Multi-version, Concurrency Control) or ( MVCC )

  • 여러 버전의 타임스탬프를 비교하여 스케줄상 직렬가능성이 보장되는 타임스탬프를 선택
  • 충돌이 발생할 경우 복귀 수행. 연쇄 복귀 발생 가능성

references

This post is licensed under CC BY 4.0 by the author.