본문 바로가기
Computer Science/Database

[데이터베이스 핵심 요약] 4. 트랜잭션(Transaction)

by pilgyeong 2022. 11. 11.

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

 

[ MySQL 아키텍처 ] 2. InnoDB 스토리지 엔진 아키텍처 (1)

InnoDB 스토리지 엔진 아키텍처 (1) 1. 프라이머리 키에 의한 클러스터링 2. 외래 키 지원 3. MVCC InnoDB 스토리지 엔진 전체 구조 InnoDB는 MySQL에서 사용할 수 있는 스토리지 엔진 중 유일하게 레코드 기

gpglab.tistory.com

 

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로 설정되어 있다.