1. 개념
한 번에 수행되어야 할 Database 내 일련의 read와 write 연산을 수행하는 단위를 말한다. 즉, 하나의 논리적 기능을 수행하기 위한 일련의 작업 단위을 일컫는다.
2. 특징 (ACID)
특징 | 설명 | 관리 주체 |
Atomicity (원자성) |
• 한 개 이상의 동작이 논리적으로 한 개의 작업 단위(single unit of work) • 연산 전체가 성공적으로 처리되거나 실패할 경우에 전체가 취소되도록 보장(All or Nothing) |
트랜잭션 관리자 |
Consistency (일관성) |
• 트랜잭션이 실행 성공 후 항상 모순 없이 일관성 있는 DB 상태 보존 | 무결성 제어기 |
Isolation (고립성) |
• 트랜잭션 실행 중 생성하는 연산의 중간결과를 다른 트랜잭션 접근 불가 | 병행제어 관리자 |
Durability (영속성) |
• 성공이 완료된 트랜잭션의 결과는 영구(속)적으로 DB에 저장 | 연관회복 관리자 |
ACID는 매우 중요한 특징이기 때문에 나중에 나올 NoSQL 특징인 BASE와 비교하여 반드시 알아두면 좋다.
3. 트랜잭션의 상태도
- Active: 초기 상태로서 트랜잭션이 실행을 시작했거나 실행 중인 상태
- Partially Committed: 마지막 명령문이 실행된 후 Commit 직전 상태 또는 Commit 명령이 도착한 상태
- Failed: 정상적인 실행이 더 이상 진행될 수 없는 상태
- Aborted(= Rollback): 트랜잭션 실행이 실패하여 취소되고 트랜잭션 시작 전 상태로 환원된 상태
- Committed: 성공이 완료된 트랜잭션의 결과는 영구적으로 데이터베이스에 저장
4. 동시성 제어
멀티프로세스 환경을 지원하는 데이터베이스 시스템에서 여러 트랜잭션들이 성공적으로 동시에 실행될 수 있도록 지원하는 기능
DBMS가 다수의 사용자 사이에서 동시에 작용하는 다중 트랜잭션의 상호간섭에서 DB를 보호하는 것을 의미
5. 동시성 제어를 하지 않을 때 발생되는 문제점
문제 | 설명 |
Lost Update (갱신 손실) |
• 트랜잭션들이 동일 데이터를 동시에 갱신할 경우에 발생 • 이전 트랜잭션이 데이터를 갱신한 후 트랜잭션을 종료하기 전에, 나중 트랜잭션이 갱신 값을 덮어쓰는 경우 |
Dirty Read (현황파악 오류) |
• 트랜잭션의 중간 수행결과를 다른 트랜잭션이 참조함으로써 발생 |
Inconsistency (모순성) |
• 두 트랜잭션이 동시에 실행할 때, DB가 일관성 없는 상태로 남는 문제 |
Cascading Rollback (연쇄복귀) |
• 복수의 트랜잭션이 데이터 공유 시 특정 트랜잭션이 처리를 취소할 경우, 다른 트랜잭션이 처리한 부분에 대하여 취소 불가능 |
Unrepeatable Read (반복할 수 없는 읽기) |
• 한 트랜잭션 내에서 같은 질의를 2번 수행했을 때, 그 사이 다른 트랜잭션의 간섭으로 결과가 다르게 나오는 오류 |
6. 동시성 제어의 목적
- 트랜잭션의 직렬성 보장 및 동시 수행 트랜잭션 처리량의 최대화
- 데이터 무결성 및 일관성 보장
- 공유도 최대, 응답시간 최소, 시스템 활동의 최대 보장
7. 동시성 제어 기법
- 2-Phase Locking
- Time Stamp Ordering: 트랜잭션마다 시간을 부여해서 먼저 도착한 트랜잭션부처 처리하는 기법
- 낙관적 검증(Validation)
- 다중버전 병행제어 기법 - MVCC(Multi-Version Concurrency Control)
[참고] MySQL InnoDB 스토리지 엔진 → MVCC : https://gpglab.tistory.com/10
8. Isolation Level
- 트랜잭션 실행 중 중간 연산 결과가 다른 트랜잭션으로 접근 불가하도록 하는 고립성 유지를 위하여 데이터를 허용하는 수준을 말한다.
- SQL-92 표준에서 4단계로 표준화하였고, 각 DBMS 벤더들이 준수하는 표준이다.
레벨 | 상태 | 설명 | 문제점 |
0 | Read Uncommitted | 트랜잭션에서 처리중인, 즉 아직 Commit 되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용함 | • Dirty Read • Non-repeatable Read • Phantom Read |
1 | Read Committed | 트랜잭션이 Commit 되어 확정된 데이터만 읽는 것을 허용함 (해당 데이터만 shared lock) | • Non-repeatable Read • Phantom Read |
2 | Repeatable Read | 선행 트랜잭션이 읽은 데이터는 트랜잭션이 종료될 때까지 후행 트랜잭션이 갱신/삭제하는 것을 허용하지 않음 | • Phantom Read |
3 | Serializable | 선행 트랜잭션이 읽은 데이터를 후행 트랜잭션이 갱신하거나 삭제하지 못할 뿐 아니라 중간에 새로운 레코드를 삽입하는 것도 허용하지 않음 | • 모두 발생 불가 • SELECT 테이블 전체 Lock |
- Isolation level이 높을수록 성능은 저하되는 반비례 관계를 가짐
9. Isolation Level에 따른 문제 현상
문제 현상 | 설명 |
Dirty Read | • 트랜잭션 A : 101번 사원 나이를 29 → 30 Update (Commit 전) • 트랜잭션 B : 101번 사원 정보를 Select 조회 (나이 30가 조회됨) • 트랜잭션 A : 문제가 생겨 Rollback (다시 29로 복구됨) |
Non-repeatable Read | • 트랜잭션 C : 991번 계좌 잔고를 Select 조회 (잔고 2,000원이 조회됨) • 트랜잭션 D : 991번 계좌이체 후 잔고를 2,000원 → 0원 Update (Commit 완료) • 트랜잭션 C : 991번 계좌 잔고를 Select 조회 (잔고 0원이 조회됨) |
Phantom Read | • 트랜잭션 E : 사원 전체 count(*) → 1,000명 • 트랜잭션 F : 신입사원 1명 Insert • 트랜잭션 E : 사원 전체 count(*) → 1,001명 |
phantom read가 발생하지 않도록 하기 위해선, 결국 serializable level으로 해야된다. 그러나, 성능 저하는 피할 수 없다.
SHOW variables like ‘tx_isolation' -- 현재 isolation level를 볼 수 있음
SET tx_isolation = ‘READ-COMMITTED’; -- read committed level으로 변경
참고로 DBMS 대부분은 기본 dafault값이 read committed로 설정되어 있다.
'Computer Science > Database' 카테고리의 다른 글
[데이터베이스 핵심 요약] 6. NoSQL (0) | 2022.11.12 |
---|---|
[데이터베이스 핵심 요약] 5. JOIN 문 (0) | 2022.11.12 |
[데이터베이스 핵심 요약] 3. DBMS 질의어 - DDL, DML, DCL (0) | 2022.11.11 |
[데이터베이스 핵심 요약] 2. DBMS(Database Management System) 정의 (0) | 2022.11.11 |
[데이터베이스 핵심 요약] 1. 데이터 독립성(Data Independence) (0) | 2022.11.11 |