키워드 : 갱신손실, 현황파악오류, 모순성, 연쇄복귀, Locking, 2PL, Timestamp
01. 트랜젝션이란
가) 트랜잭션의 개념
- 하나의 논리적인 작업 단위를 이루는 여러 연산 집합으로 데이터베이스의 일관된 상태를 또 다른 일관된 상태로 변환시킴
- 한 번에 수행되어야 할 데이터베이스의 일련의 읽기(Read)와 쓰기(Write) 연산을 수행하는 단위
나) 트랜잭션의 ACID 특징
특징 | ACID가 깨지는 사례 |
Atomicity (원자성) |
철수는 10건의 데이터를 입력 처리하는 작업을 1개의 트랜잭션으로 처리하는데 9건을 성공적으로 수행되었고 한 건은 실패되어 저장 -> 1개의 트랜잭션에서 모든 데이터는 함께 성공하든지 함께 실패하든지 해야 함 |
Consistency (일관성) |
강희는 SQL의 연산을 칼럼1+칼럼2+칼럼3-칼럼4의 로직으로 실행하는데 실행 때마다 예측된 결과가 나오지 않고 다른 결과가 나오는 경우가 있음 -> 트랜잭션의 실행은 항상 기대되는 값을 정확하게 보여줘야 함, 중간에 다른 트랜잭션이 끼어들지 못 하게 하는 Lock, Timestamp, Validation 등을 사용하여 제어함 |
Isolation (고립성) |
영희가 100건의 데이터를 수정하는 작업을 실행하여 데이터베이스에서는 35건째 수정작업이 진행 중인데 첫 번째 수정한 데이터를 철수가 접근하여 재수정하였다. -> 트랜잭션의 Commit 또는 Rollback이 발행되기 전에 다른 트랜잭션이 끼어들어서 처리하면 안 됨 |
Durability (영속성) |
철수가 10건의 회원 정보를 회원 테이블에 저장(Insert)하고 성공적으로 Commit 하였으나 전원이 일시적으로 나갔다가 들어오면서 데이터가 유실됨 ->한번 성공한 트랜잭션은 지속성을 보장해야 함, 이 같은 경우 순방향 복구 알고리즘에 의해 복구되어야 함 |
- 트랜잭션 완료(Commint) 연산 : 트랜잭션 안에서 수행한 모든 SQL 문장들의 결과를 데이터베이스에 영구적으로 반영하면서 해당 트랜잭션을 종료하는 연산
- 트랜잭션 복귀(Rollback) 연산 : 트랜잭션의 수행 도중에 치명적인 오류가 있어 더 이상 진행할 수 없거나, 사용자에 의해 반영 취소 명령(rollback)이 수행되었을 때 지금까지 수행해왔던 트랜잭션 안에서 변경된 모든 데이터 값을 트랜잭션 수행 이전 상태로 되돌리는 연산{즉, 트랜잭션을 철회(abort)하는 연산}
라) 트랜잭션 처리 시 고려사항
- 트랜잭션의 동시성 구현 : 트랜잭션의 동시 실행은 트랜잭션의 처리율과 시스템 이용률을 높이고 대기시간을 줄임으로써 동시성을 높일 수 있음
- 트랜잭션 수행시간을 최대한 짧게 수행 : 긴 트랜잭션의 경우에 잠금(Lock) 수행시간이 길어져 충돌 현상 및 교착상태를 발생시킬 소지가 큼. 트랜잭션은 직렬성을 보장할 수 있도록 잠금(Lock)을 충분히 오랫동안 유지해야 하지만 동시에 성능을 저하하지 않도록 짧게 구성할 필요가 있음.
02. 동시성(병행)제어
가) 트랜잭션의 직렬가능 스케줄의 정의
- 직렬성을 가진 트랜잭션 스케줄이란 각각의 트랜잭션이 동시에 수행되더라도 그 결과가 순차적으로 트랜잭션이 수행된 결과와 같은 경우
- 트랜잭션의 직렬화 수행 보장
![](https://blog.kakaocdn.net/dn/kXU8V/btrIekBCT1L/vQQqvyLDfpyjKPvQKs0TH1/img.png)
나) 동시성(병행) 제어의 정의
- 다중 사용자 환경을 지원하는 데이터베이스 시스템에서 여러 트랜잭션이 성공적으로 동시에 실행될 수 있도록 지원하는 기능
- 다중 사용자 환경을 지원하는 데이터베이스 시스템의 경우 필수적으로 지원해야 하는 기능으로 동시성(병행) 제어라고도 함
다) 동시성(병행) 제어의 목적
- 직렬가능스케줄(Serializable Schedule)의 생성 또는 트랜잭션들의 직렬가능성 보장
- 공유도 최대, 응답시간 최소, 시스템 활동의 최대 보장
- 데이터의 무결성 및 일관성 보장
라) 동시성(병행) 제어를 하지 않았을 경우 발생하는 문제점
구분 | 내용 |
갱신 손실 (Lost Update) |
- 트랜잭션들이 동일 데이터를 동시에 갱신할 경우 발생 - 이전 트랜잭션이 데이터를 갱신한 후 트랜잭션을 종료하기 전에 나중 트랜잭션이 갱신 값을 덮어쓰는 경우 발생 |
오손 데이터 읽기 (Dirty Read) |
- 트랜잭션의 중간 수행 결과를 다른 트랜잭션이 참조함으로써 발생하는 오류 - 현황파악오류 |
모순성 (Inconsistency) |
- 두 트랜잭션이 동시에 실행할 때 DB가 일관성이 없는 상태로 남는 문제 |
연쇄 복귀 (Cascading Rollback) |
-복수의 트랜잭션이 데이터 공유 시 특정 트랜잭션이 처리를 취소할 경우 다른 트랜잭션이 처리한 부분에 대해 취소 불가능 |
반복할 수 없는 읽기 (Unrepeatable Read) |
- 한 트랜잭션 내에서 같은 질의를 두 번 수행했는데, 그사이에 다른 트랜잭션이 값을 수정 또는 삭제하는 경우 두 질의의 결과가 다르게 나타나는 현상 |
마) 동시성(병행) 제어 기법들
- 잠금(Lock) 기반 기법
- 타임 스탬프 기반 기법
- 다중버전 기법
- 검증(낙관적) 기반 기법
바) 2PL(2-Phase Locking) 기법이란
- 직렬성 보장을 통해 동시성을 제어하는 2단계 잠금(Locking) 기법으로 Lock과 Unlock 연산을 확장단계와 수축단계로 구분하여 수행하는 2 PL 규약을 따른다.
- 확장단계 : 트랜잭션은 Lock만 수행할 수 있고 Unlock은 수행할 수 없는 단계
- 수축단계 : 트랜잭션은 Unlock만 수행할 수 있고 Lock은 수행할 수 없는 단계
![](https://blog.kakaocdn.net/dn/c2yK1G/btrIhjoLW6r/KuSlSDovVlsouoRGXtrku0/img.png)
- 모든 잠금 연산(Read_Lock, Write_Lock)들이 최초의 unlock 연산보다 앞에 나오는 경우, 그 트랜잭션은 2단계 잠금 프로토콜을 준수한다.
- 만일 모든 트랜잭션이 2단계 잠금 규약을 준수한다면, 모든 트랜잭션은 직렬성을 보장받게 되나 그 역은 성립하지 않는다.
- 직렬가능성을 보장할 수 있는 규약으로 가장 많이 사용된다.
03. 트랜잭션 수준(Isolation Level)
가) 완료되지 않은 읽기(Read Ucommitted)
- 트랜잭션에서 처리 중인 아직 완료되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다.
나) 완료된 읽기(Read Committed)
- 트랜잭션이 완료되어 확정된 데이터만 다른 트랜잭션이 읽도록 허용한다.
다) 반복 읽기(Repeatable Read)
- 트랜잭션 내에서 질의를 두 번 이상 수행할 때, 첫 번째 질의에 있던 레코드가 사라지거나 값이 바뀌는 현상을 방지해준다.
라) 직렬화(Serializable Read)
- 트랜잭션 내에서 질의를 두 번 이상 수행할 때, 첫 번째 질의에 있던 레코드가 사라지거나 값이 바뀌지 않음은 물론 새로운 레코드가 나타나지도 않게 한다.
Isolation Level | Dirt Read | Non repeatable Read | Phantom Read |
레벨 0 Read Uncommitted | 발생 | 발생 | 발생 |
레벨 1 Read Committed | X | 발생 | 발생 |
레벨 2 Repeatable Read | X | X | 발생 |
레벨 3 Serializable | X | X | X |
04. 교착상태(Daedlock)
가) 교착상태 정의
- 다중처리 환경 또는 다중 트랜잭션 데이터베이스 시스템에서 다수의 프로세스 또는 트랜잭션이 특정 자원의 할당을 무한정 기다리고 있는 상태
- 교착상태에 있는 트랜잭션들은 결코 실행을 끝넬 수 없으며 시스템 자원이 묶여있어서 다른 작업을 시작하는 것도 불가능하므로, 교착상태가 발생하면 반드시 시스템은 두 트랜잭션 중의 하나를 취소시켜야 한다.
![](https://blog.kakaocdn.net/dn/egiUu2/btrIbLHmbf0/f71Ar91cv8Erc9EOiuRy61/img.png)
- 모든 트랜잭션이 실행을 전혀 진전시키지 못하고 무한정 기다리고 있는 상태
- T1은 T2가 데이터 X를 Unlock 하기를 기다림
- T2는 데이터 X를 Locking하고 있는 상태
- T2는 T이 데이터 Y를 Unlock 하기를 기다림
- T1은 데이터 Y를 Locking하고 있는 상태
구분 | Deadlock(교착상태) | Stravation(무한대기) |
정의 | 다수의 프로세스가 아무 일도 못 하고 특정사건 무한대기 | 특정 프로세스가 자원을 할당받기 위한 무한정 대기 상태 |
발생원인 | 상호배제, 점유와 대기, 비선점, 환형 대기 | 자원의 편중된 분배정책 |
해결방안 | 예방, 회피, 발견, 회복 | Aging 기법 |
원인 | 내용 |
상호배제(Mutual Exclusion) | 프로세스들이 자원을 배타적으로 점유하여 다른 프로세스가 그 자원을 사용하지 못함 |
점유와 대기(Block & Wait) | 프로세스가 어떤 자원을 할당받아 점유하고 있으면서 다른 자원을 요구 |
비선점(Non Preemption) | 프로세스에 할당된 자원은 사용이 끝날 때까지 강제로 빼앗을 수 없으며, 점유하고 있는 프로세스 자신만이 해제 가능 |
환형 대기(Circular wait) | 프로세스 간 자원 요구가 하나의 원형으로 구성 |
해결방안 | 내용 |
교착상태 예방 (Deadlock Prevention) |
- 시스템이 교착상태에 빠지지 않도록 보장하는 규약 사용 - 시스템이 교착상태에 빠질 확률이 상대적으로 높을 때 사용 - 상호배제 예방, 부분할당 예방, 비선점 예방, 환형 대기 예방 - 회피기법 : 타임 스탬프를 사용하는 Wait-Die, Wound-Wait 기법 |
교착상태 탐지와 복구 (Deadlock detection & Recovery) |
- 시스템이 교착상태에 빠질 수 있도록 하고 교착상태 탐지와 복구 기법을 이용하여 교착상태 해결 - Dection : 시스템의 상태 감시를 알고리즘을 통하여 교착상태 검사(Wait for Graph reduction, cycle dection, knot detection) - Recovery : deadlock이 없어질 때까지 프로세스를 순차적으로 Kill 하여 제거함{희생자 선택(프로세스 최소 종료 비용을 계산), 롤백, 기아 상태} |
관련 링크
1. Topic > 동시성 제어(Concurrency Control)/병행 제어
2. 합격답안 > [답안] 동시성 제어 필요성, 해결방법(1교시)
'TOPCIT > TOPCIT교재' 카테고리의 다른 글
VII. 데이터베이스 품질과 표준화 - 안혜진 (0) | 2022.07.26 |
---|---|
III. 데이터베이스 설계 및 구축절차 - 문경숙 (0) | 2022.07.26 |
VI.데이터베이스 물리설계 - 손선희 (0) | 2022.07.24 |
소프트웨어 유지관리 - 이상희 (0) | 2022.07.18 |
소프트웨어 형상관리 - 권준호 (0) | 2022.07.18 |