728x90
DBMS는 여러 사용자가 DB에 동시에 접근할 수 있다.
여러 사용자가 동시에 접근하면 트랜잭션도 동시에 여러 개가 실행되는데 DBMS는 여러 트랜잭션을 동시에 실행하기 위해 병행 수행을 지원한다.
그리고 이 병행 수행이 잘 이루어지도록 하기 위해서 병행 제어를 실시한다.
트랜잭션의 속성 ACID중 I에 해당하는 Isolation을 보장하기 위한 것이 병행 제어 Concurrency Control이다.
(자세한 것은 위 글씨에 달아둔 링크 참고)
1. 병행 수행이란?
- 정의 : 여러 사용자가 DB에 접근할 때 여러 트랜잭션이 수행되는데 이 여러 트랜잭션들을 병행 수행시키는 방식
- 운영체제가 멀티 프로세스를 지원하는 것과 비슷한 모양
- 여러 트랜잭션을 수행하는 순서가 중요하므로 트랜잭션 스케줄에 따라 트랜잭션을 실행
트랜잭션 스케줄의 종류
- 직렬 스케줄 Serial schedule
👉 트랜잭션을 연산 단위로 번갈아가며 수행하지 않고 각 트랜잭션을 순차적으로 수행시키는 방식
- 트랜잭션들이 겹치지 않도 한 번에 하나씩 실행됨
- 장점: 하나씩 수행되기 때문에 순서와 정합성이 보장됨
- 단점: 오래 걸리는 작업을 하는 동안 CPU가 낭비되어 좋은 성능을 낼 수 없음. 현실에서는 사용할 수 없음
- 비직렬 스케줄 non-serial schedule
👉 트랜잭션을 연산 단위로 번갈아가며 수행하는 방식. 병행 수행이 비직렬 스케줄에 포함됨
- 장점: 병렬적으로 처리하기 때문에 동시성이 높아짐 👉 같은 시간에 더 많은 트랜잭션을 처리할 수 있음 👉 성능 굿
- 단점: 트랜잭션이 어떤 형태로 겹쳐 실행되는지에 따라 의도치 않은 결과(이상 현상)가 나올 수 있음
- 직렬 가능 스케줄
👉 직렬 스케줄처럼 정확한 결과를 생성하는 비직렬 스케줄
2. 병행 제어란?
- 정의 : 여러 트랜잭션이 병행 수행되며 서로 다른 데이터에 접근하지 않고, 같은 데이터에 접근한다면 데이터에 문제가 생길 수 있음. 이를 방지하기 위해 같은 데이터에 접근하더라도 문제가 생기지 않도록 제어하는 것
- 운영체제가 멀티 프로세스 또는 멀티 스레드로 프로그램을 실행할 때 임계구역을 설정하는 것과 비슷함
- 목적
- DB 공유와 시스템 활용 최대화
- DB의 일관성 유지
- 사용자에 대한 응답시간 최소화
- 단위 시간당 트랜잭션 처리 건수 최대화
3. 병행 제어를 하지 않으면?
비직렬 스케줄을 사용해서 여러 트랜잭션을 수행할 때 적절한 병행 제어 기법이 사용되지 않으면 다음과 같은 문제들이 발생할 수 있다.
갱신 분실 Lost Update
- 정의: 두 개의 트랜잭션이 같은 데이터에 대해서 동시에 갱신 작업을 하면 하나의 갱신 작업이 분실되는 경우
- 하나의 트랜잭션이 수행한 데이터 변경 연산이 저장되기 전에 다른 트랜잭션이 데이터를 가지고 가서 데이터를 변경하고 다시 저장하는 경우 첫 번째 트랜잭션이 수행한 연산은 무효가 된다.
모순성 Inconsistency
- 정의: 한 개의 트랜잭션 작업이 갱신 작업을 하고 있는 상태에서 또 하나의 트랜잭션이 같은 작업 구역에 침범하여 작업하게 되어 데이터베이스의 일관성을 해치는 경우
- 갱신 분실과의 차이점❓
: 갱신 분실과는 달리 모순성은 여러 데이터를 가져올 때 발생하는 문제
연쇄 복귀 Cascading Rollback
- 정의: 같은 자원을 사용하는 두 개의 트랜잭션 중 한 개의 트랜잭션이 성공적으로 일을 수행했다고 하더라도 다른 트랜잭션이 처리하는 과정에서 실패하게 되면 두 개의 트랜잭션 모두가 복귀되는 현상
비완료 의존성 Uncommitted Dependency
- 정의: 한 개의 트랜잭션이 수행 과정에서 실패했을 때, 이 트랜잭션이 회복되기 전에 다른 트랜잭션이 수행 결과를 참조하는 현상
- 한 트랜잭션이 수행 중 장애가 생겨 rollback 연산을 하기 전에 해당 트랜잭션이 갱신한 데이터를 다른 트랜잭션에서 이미 가져갔다면 데이터베이스에 있는 데이터와 트랜잭션이 가지고 있는 데이터가 다르게 되는 문제가 발생함
4. 병행제어 기법
로킹 Locking
- 정의: DB 병행 제어를 위해 트랜잭션이 어떤 데이터에 접근하고자 할 때 데이터를 잠가(lock) 다른 트랜잭션이 접근하지 못하도록 하는 병행 제어 기법
- 로킹을 한 트랜잭션만이 로킹을 해제할 수 있음 👉 로킹되어 있는 데이터에는 다른 트랜잭션이 접근할 수 없음
- 트랜잭션은 로킹이 된 데이터에 대해서만 연산을 수행할 수 있음
- 로킹 단위: 필드, 레코드, 파일, 데이터베이스
- 로킹 단위가 크면: 관리하기가 용이(로킹 오버헤드 감소), 하지만 동시성 수준이 낮아짐
- 로킹 단위가 작으면: 동시성 수준이 높아지지만 관리가 까다로움(로킹 오버헤드 증가)
- 2단계 로킹 규약(Two-Phase Locking Protocol)
: Lock과 Unlock이 동시에 이루어지면 일관성이 보장되지 않음
👉 Lock만 가능한 단계와 Unlock만 가능한 단계를 구분
- 장점: 직렬가능성을 보장함
- 단점: 교착상태가 발생할 수 있음
- 확장단계: 트랜잭션이 Lock만 할 수 있고 Unlock은 할 수 없음
- 축소단계: 트랜잭션이 Unlock만 할 수 있고 Lock은 할 수 없음
- 장점: 직렬가능성을 보장함
로킹 단위 | 로크의 수 | 병행 제어 | 로킹 오버헤드 | 병행성 수준 | 데이터베이스 공유도 |
커짐 | 적어짐 | 단순해짐 | 감소 | 낮아짐 | 감소 |
작아짐 | 커짐 | 복잡해짐 | 증가 | 높아짐 | 증가 |
더보기
로킹 단위가 크면 나머지가 다 작아짐
로킹 단위가 작으면 나머지가 다 커짐
타임스탬프 Time Stamp
- 정의: 데이터에 접근하는 시간을 미리 정하여 정해진 시간의 순서대로 데이터에 접근하며 수행하는 병행 제어 기법
- 장점: 직렬가능성을 보장하며 시간을 나눠 사용하기 때문에 교착 상태가 발생하지 않음
- 단점: 하지만 연쇄복귀를 초래할 수 있음
낙관적 병행제어 Optimistic Concurrency Control
- 정의: 트랜잭션 수행 동안은 어떠한 검사도 하지 않고, 트랜잭션 종료 시에 일괄적으로 검사하는 병행 제어 기법
- 트랜잭션 수행 동안 그 트랜잭션을 위해 유지되는 데이터 항목의 지역사본에 대해서만 갱신하며 트랜잭션 종료 시에 동시성을 위한 트랜잭션 직렬화가 검증되면 일시에 DB로 반영함
다중 버전 병행제어 Multi-version Concurrency Control
- 정의: 하나의 데이터 아이템에 대해 여러 버전의 값을 유지하며 조회성능을 최대한 유지하기 위한 병행 제어 기법
- 단점: 트랜잭션 간의 충돌 문제는 대기가 아니라 복귀처리 함으로 연쇄복귀초래 발생 가능성이 있음
참고
'Computer Science > DB' 카테고리의 다른 글
[DB] RDBMS와 NoSQL (1) | 2024.03.18 |
---|---|
[DB] 트랜잭션(3) - 격리 수준(Isolation level)과 이상 현상 (0) | 2024.03.14 |
[DB] 트랜잭션(1) - 정의, ACID, 상태, 문법, 예외 (0) | 2024.03.13 |
스터디 1회차 예상 질문 (0) | 2024.03.11 |
[DB] ERD와 정규화(Normalization) 과정 (0) | 2024.03.11 |