dongdorodongdong
병행제어(동시성 제어) 본문
정의
- 다수 사용자 환경에서 여러 트랜잭션을 수행할 때, 데이터베이스 일관성 유지를 위해 상호 작용을 제어 하는 것.
- 트랜잭션의 Isolation 성질을 보면 트랜잭션을 독립적으로 만들어 주었다. 근데 만약에 여러 트랜잭션이 하나의 값에 접근을 한다면? 여러 문제가 발생할 수 있다.
> 다중 프로그램 환경에서 여러 개의 트랜잭션을 병행 수행 한다는 것은 같은 시간에 여러 개의 명령을 동시에 실행한다는 것이 아니라, 시분할, IO인터럽트 기법 등을 이용하여 일정한 시간 내에 각 트랜잭션에 있는 명령들이 시간적으로 번갈아 실행되는 것이다. 또, 병행 수행된 각각의 트랜잭션 결과는 각 트랜잭션을 독자적으로 수행시켰을 때의 결과와 같아야 하는데 이것을 직렬성(Serializability)이라고 한다.
목적
- 데이터베이스 공유 최대화
- 시스템 활용도 최대화
- 데이터베이스 일관성 유지
- 응답시간 최소화
문제점
- 병행 제어 없이 트랜잭션들이 데이터베이스에 접근한다면 다음과 같은 문제점이 발생
- 갱신 분실(Lost Update)
- 2개 이상의 트랜잭션이 같은 데이터를 공유하여 갱신할 때 갱신 결과의 일부가 없어지는 현상 - 모순성 (Inconsistency)
- 복수의 사용자가 동시에 같은 데이터를 갱신할 때 데이터들이 상호 일치하지 않아 모순된 결과가 발생 - 연쇄 복귀(Cascading Rollback)
- 병행수행되던 트랜잭션들 중 어느 하나에 문제가 생겨 Rollback되는 경우 다른 트랜잭션들도 함께 Rollback 되는 현상 - 비완료 의존성(Uncommitted Dependency)
- 하나의 트랜잭션 수행이 실패한 후 회복되기 전에 다른 트랜잭션이 실패한 갱신 결과를 참조하는 현상
기법
- 로킹 기법
- 타임 스탬프 기법
- 검증(낙관적) 기법
교착상태(Deadlock)
- 모든 트랜잭션이 실행을 전혀 하지 못하고 무한정 기다리고 있는 상태
- 필요 충분 조건
- 상호 배제(Mutual Exclusion)
- 대기 (Wait-For)
- 선취 금지(No Preemption)
- 순환 대기(Circular Wait) - 해결책
- 회피 : 자원을 할당할 때마다 deadlock이 일어나지 않도록 실시간 알고리즘을 이용하여 검사
- 예방 : 트랜잭션을 실행시키기 전에 deadlock 발생이 불가능 하도록 만드는 방법
- 탐지 : deadlock이 발생한 뒤에 deadlock 발생 조건의 하나를 제거하는 기법
로킹(Locking)
- 주요 데이터의 액세스를 상호 배타적으로 하는 것.
- 트랜잭션이 데이터를 Read, Write하기 위해서는 반드시 Lock을 걸어야 함.
- 트랜잭션이 종료되기 전에 반드시 Unlock을 해주어야 함.
- Lock을 설정하고 데이터를 사용하면 다른 트랜잭션은 접근하지 못한다.
- Lock을 건 트랜잭션만이 Lock을 해제할 수 있다.
- Shared Lock
- 트랜잭션은 데이터를 읽을 수 있지만 기록할 수 없다.
- 다른 트랜잭션도 Shared Lock을 동시에 설정할 수 있다. - Exclusive Lock
- 트랜잭션은 데이터를 읽을 수 있고 기록할 수 있다.
- 다른 트랜잭션은 Exclusive Lock이 설정된 데이터에 어떠한 Lock도 설정할 수 없다. - 로킹단위
- 한꺼번에 Lock을 할 수 있는 단위
- 데이터베이스 > 파일> 레코드 > 필드 등이 있다.
> 로킹 단위가 크면 로크의 수가 작아 관리가 용이하다. 하지만 로크의 수가 작기 때문에 병행성 수준이 낮고 오버헤드가 감소한다.
2단계 로킹 규약(Two-Phase Locking Protocol)
- Lock을 걸고 해제하는 시점에 제한을 두지 않으면 두 개의 트랜잭션이 동시에 실행될 때 데이터의 일관성이 깨질 수 있어서 로킹 단계를 2개로 구분하여 이를 방지하는 방법
- 교착 상태가 발생할 수도 있다.
- 확장 단계
- 트랜잭션은 새로운 Lock 연산만 할 수 있고, Unlock 연산은 할 수 없는 단계 - 축소 단계
- 트랜잭션은 Unlock 연산만 할 수 있고, Lock 연산은 할 수 없는 단계
타임 스탬프(Time Stamp Ordering)
- 트랜잭션 간의 처리 순서를 미리 선택하는 기법들 중에서 가장 보편적인 방법.
- 트랜잭션이 실행을 시작하기전에 시간표(Time Stamp)를 부여하여 부여된 시간에 따라 트랜잭션 작업을 수행하는 기법.
- 교착 상태가 발생하지 않는다.
- 읽기 전용 트랜잭션이 대부분일 경우, 병행 제어를 하지 않아도 문제가 없다는 점을 이용.
- 검증과 확인하는 과정이 필요하다.
'Database' 카테고리의 다른 글
시스템 카탈로그(데이터 사전) (0) | 2019.03.24 |
---|---|
정규화 (0) | 2019.03.24 |
Transaction (0) | 2019.03.24 |
스키마 (0) | 2019.03.24 |
릴레이션 (0) | 2019.03.24 |