반응형
트랜잭션(Transaction)의 개념
하나의 논리적 기능을 수행하기 위한 작업의 단위
한 번에 수행되어야 할 DB의 일련의 Read와 Write 연산을 수행하는 단위
ACID 특징
- Atomicity (원자성)
- 한 개 이상의 동작이 논리적으로 한 개의 작업 단위
- 연산 전체가 성공적으로 처리되거나 실패할 경우 전체가 취소되도록 보장
- 관리주체 : 트랜잭션 관리자
- Consistency (일관성)
- 트랜잭션이 실행 성공 후 항상 모순 없이 일관성 있는 DB 상태 보존
- 관리주체 : 무결성 제어기
- Isolation (고립성)
- 트랜잭션 실행 중 생성하는 연산의 중간결과를 다른 트랜잭션 접근 불가
- 관리주체 : 병행 제어 관리자
- Durabillity (영속성)
- 성공이 완료된 트랜잭션의 결과는 영구적으로 데이터베이스에 저장됨
- 마음대로 데이터가 삭제되거나 변경되면 안 된다.
- 관리주체 : 연관 회복 관리자
트랜잭션 상태도
Partially Committed (부분적 완료)
트랜잭션이 시작하고 어떤 질의어들이 성공을 하게 되면 Partially Committed 상태가 되는데 Partially Committed는 오류가 없이 Commit 직전까지 모든 질의어가 수행되는 상태를 말한다.
상태 | 설명 | 전이 |
Active | 초기 상태, 트랜잭션 실행 시작 또는 실행 중인 상태 | Partially Committed, Failed |
Partially Committed | 마지막 명령문이 실행된 후 Commit 직전 상태 Commit 명령이 도착한 상태 |
Failed, Commit |
Failed | 정상적인 실행이 진행될 수 없는 상태 | Aborted |
Aborted | 트랜잭션 실행이 실패하여 취소되고 트랜잭션 시작 전 상태로 환원된 상태 (Rollback) | 종료 |
Committed | 성공이 완료된 트랜잭션의 결과는 영구적으로 데이터베이스에 저장 | 종료 |
동시성 제어
- 멀티 프로세스 환경을 지워 나는 데이터베이스 시스템에서 여러 트랜잭션들이 성공적으로 동시에 실행될 수 있도록 지원하는 기능
- DBMS가 다수의 사용자 사이에서 동시에 작용하는 다중 트랜잭션의 상호 간섭에서 Database를 보호하는 것을 의미
트랜잭션 여러 개가 동시에 접근했을 때 직렬화 수행을 통해 데이터를 한 번씩 접근하도록 보장하는 기능
직렬화 수행을 하지 않았을 경우, Dirty Read나 Phantom Read 등 문제 있는 데이터가 나타날 수 있다.
동시성 제어와 성능은 반비례하다.
동시성 제어를 하지 않았을 때 문제점
구분 | 설명 |
갱신 손실 (Lost Update) | 트랜잭션들이 동일 데이터를 동시에 갱신 할 경우 발생 이전 트랜잭션이 데이터를 갱신한 후 트랜잭션을 종료하기 전에 나중 트랜잭션이 갱신 값을 덮어쓰는 경우 발생 |
현황파악오류 (Dirty Read) | 트랜잭션의 중간 수행결과를 다른 트랜잭션이 참조함으로써 발생하는 오류 |
모순성 (Inconsistency) | 두 트랜잭션이 동시에 실행할 때 DB가 일관성이 없는 상태로 남는 문제 |
연쇄복귀 (Cascading Rollback) | 복수의 트랜잭션이 데이터 공유 시 특정 트랜잭션이 처리를 취소할 경우 다른 트랜잭션이 처리한 부분에 대해 취소 불가능 |
반복할 수 없는 읽기 (Unrepeatable Read) | 한 트랜잭션 내에서 같은 질의를 2번 수행했을 때 그 사이 다른 트랜잭션의 간섭으로 결과가 다르게 나오는 오류 |
동시성 제어의 목적
- 트랜잭션의 직렬 성 보장 및 동시 수행 트랜잭션 처리량 최대화
- 데이터의 무결성 및 일관성 보장
- 공유도 최대, 응답 시간 최소, 시스템 활동의 최대 보장
동시성 제어 기법들
- 2-Phase Locking 기법
- 특정 트랜잭션이 하나씩 수행될 때 프로그램의 쿼리에 잡힌 테이블들을 트랜잭션이 실행되기 전 Lock을 잡고 다시 하나씩 Unlock으로 푸는 기법
- TimeStamp Ordering 기법
- 트랜잭션마다 시간을 부여해서 먼저 도착한 트랜잭션 순으로 실행시키는 기법
- 낙관전 검증(Validation) 기법
- Read, Validation, Write 3단계 구간에 교차되는 구간이 있는지 검사하면서 실행하는 기법
- 다중 버전 병행 제어 기법 - MVCC(Multi-Version Concurrency Control)
- Update 또는 Delete 문이 실행될 때 Update 전의 데이터를 Undo 영역에 백업을 하고 최신의 SCN(System Commit Number) 값을 Undo 영역에서 조회를 해서 아직 갱신되지 않은 직전의 데이터를 가지고 오는 기법
- Lock을 잡는 순간이 더 짧다
Isolation Level
- 트랜잭션 실행 중 중간 연산 결과가 다른 트랜잭션으로 접근 불가하도록 하는 고립성을 유지하기 위한 데이터의 허용 수준
- SQL-92 표준에서 4단계로 표준화, 대부분의 DBMS 벤더들이 준수하고 있다.
레벨 | 상태 | 설명 | 전이 |
0 | Read Uncommitted | 트랜잭션에서 처리중인 아직 Commit 되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용 | Dirty Read Nonrepeatable Read Phantom Read |
1 | Read Committed | 트랜잭션이 Commit 되어 확정된 데이터만 읽는 것을 허용 (해당 데이터만 shared lock) | Nonrepeatable Read Phantom Read |
2 | Repeatable Read | 선행 트랜잭션이 읽은 데이터는 트랜잭션이 종료될 때까지 후행 트랜잭션이 갱신, 삭제 불가 | Phantom Read |
3 | Serializable | 선행 트랜잭션이 읽은 데이터를 후행 트랜잭션이 갱신하거나 삭제하지 못할 뿐 아니라 중간에 새로운 레코드를 삽입도 금지 | 모두 발생 불가 Select 테이블 전체 Lock |
문제점
Dirty Read
- 트랜잭션 A가 수정 중인 데이터를 트랜잭션 B가 조회를 하고, 문제가 발생해 Rollback을 했을 경우 트랜잭션 B는 수정된 데이터로 로직을 실행한다.
Non-repeatable Read
- 트랜잭션 B가 데이터를 두 번 조회할 때, 그 사이에 트랜잭션 A가 값을 수정 또는 삭제했을 경우 데이터가 다르게 나타나는 문제가 발생한다.
- 은행 관련 서비스에 문제가 발생할 수 있다.
Phantom Read
- 트랜잭션 B가 데이터를 두번 조회할 때, 첫번째 데이터에는 없었던 유령(Phantom) 데이터가 발생하는 현상이다.
- 테이블에 전체 lock을 걸지 않았기 때문에 발생한다.
Isolation level 설정값 확인 명령어
show variable like 'tx_isolation';
Isolation level 설정 변경 명령어
set tx_isolation='READ-COMMITED';
반응형
'DB > DBMS' 카테고리의 다른 글
[DBMS] DBMS 질의어 (0) | 2022.10.31 |
---|---|
[DBMS] DBMS의 정의 (0) | 2022.10.28 |
[DBMS] 데이터 독립성 (0) | 2022.10.27 |
[DBMS] DataBase란? (0) | 2020.11.29 |