본문 바로가기

CS/데이터베이스

[데이터베이스] 트랜잭션

https://en.wikipedia.org/wiki/Isolation_(database_systems)


트랜잭션

하나의 논리적 동작을 정상적으로 수행하는데 필요한 DB 연산들을 모아놓은 데이터베이스 시스템 작업의 기본 단위

ACID 원칙

트랜잭션이 가진 4가지 특성

특성 설명 달성 방법
Atomicity (원자성) 트랜잭션 구성 연산은 모두 실행되거나, 하나도 실행되지 않아야 한다.
장애로 인해 연산이 중단되면 트랜잭션 수행 이전으로 작업을 되돌릴 수 있어야 한다. 
All or Nothing
Commit / Rollback
Consistency (일관성) 트랜잭션 성공 전·후에 대한 일관성을 유지해야 한다 (완료 시점에 일관된 상태).
ex) 계좌 이체 시 총 금액은 일치해야 함
무결성 제약조건
동시성 제어
Isolation (고립성) 실행되고 있는 트랜잭션들은 서로의 연산에 영향을 미쳐서는 안된다.
현재 진행 중인 트랜잭션의 연산에 대해 다른 트랜잭션은 접근할 수 없어야 한다.
고립 수준(isolation level)
Durability (영속성) 트랜잭션 완료 후 반영된 수행결과는 손실 없이 영구적으로 데이터베이스에 반영되어야 한다. 회복 기법

트랜잭션 상태

  • Active: 트랜잭션이 수행되기 시작하여 현재 활동 중인 상태
  • Partially Committed: 트랜잭션 마지막 연산이 수행된 직후. 연산은 끝났지만, 최종 결과는 DB에 반영되지 않은 상태
  • Committed: 트랜잭션을 DB에 반영한 상태
  • Failed: 트랜잭션 중 장애가 발생하여 중단 / 실패한 상태
  • Aborted: 현재까지 진행된 연산을 취소하고 되돌린 상태

트랜잭션 연산

  • Commit: 트랜잭션 성공 선언(작업 완료) ▶ 수행한 최종 결과를 DB에 반영한다.
  • Rollback: 트랜잭션 실패 선언(작업 취소) ▶ 수행 결과를 취소하고, 트랜잭션 실행 이전으로 복귀한다.
  • Checkpoint: Rollback을 위한 시점을 지정한다.

동시성 제어(Concurreny Control)

 다중 사용자 환경에서 트랜잭션 수행 시 데이터베이스 일관성 유지를 위해 수행을 제어하는 것으로,

  • 데이터베이스 공유 최대화
  • 시스템 활용도 최대화
  • 데이터베이스 일관성 유지
  • 응답 시간 최소화

Concurrency(동시성)

interleaving 방식으로 번갈아가며 트랜잭션을 수행하는 것. 동일 데이터에 접근하면 예상치 못한 결과 발생 가능

미보장 시 발생 가능한 문제점

  • lost update(갱신 분실): 한 트랜잭션이 수행한 데이터 변경 연산 결과를 다른 트랜잭션이 덮어 써서 무효화
  • dirty read: 트랜잭션 수행 결과를 다른 트랜잭션이 참조
  • inconsistency(모순성): 트랜잭션이 동시에 실행되어 데이터베이스 일관성이 결여
  • cascading rollback(연쇄복귀): 트랜잭션 장애가 발생했을 때 데이터를 공유하는 복수의 트랜잭션에 영향이 전파되어 다른 트랜잭션들도 함께 ROLLBACK해야 하는 문제. 이미 COMMIT된 경우 취소가 불가능

트랜잭션 스케줄

  • 직렬 스케줄: 트랜잭션 별로 연산을 순차 실행. 트랜잭션 실행 순서에 따른 결과는 달라도 최종 결과는 동일
  • 비직렬 스케줄: interleaving 통해 트랜잭션 동시성 수행. 언급한 문제 발생 가능, 결과 정확성은 보장 X
  • 직렬가능 스케줄: 직렬 스케줄처럼 정확한 결과를 생성. 모든 비직렬 스케줄에 적용할 수는 없으며, 이를 판단하는 것도 어려움. 대신 직렬 가능성을 보장하는 동시성 제어 기법을 통해 달성 가능

동시성 제어기법

모든 트랜잭션에 대한 직렬 가능성을 보장하는 규약

로킹(locking)

동시 수행되는 트랜잭션들이 동일 데이터에 동시에 접근할 수 없도록 lock / unlock 통해 제어. mutual exclusion(상호 배제)을 기반으로 하나의 트랜잭션만 자원에 접근하도록 허용

  • read/write 실행 전 lock 연산 수행
  • 다른 트랜잭션이 lock 한 데이터는 다시 잠글 수 없음
  • 연산이 종료되면 unlock 연산 통해 자원 독점권 반납
  • unlock은 lock한 자원에 대해서만 수행 가능

 

  • locking 단위가 클수록 제어가 쉽지만 병행성은 감소
  • 기본 locking 규칙만으로는 병행성이 제한
    • shared lock: 읽기 가능. 여러 트랜잭션이 데이터 사용권 공유
    • exclusive lock: 읽기/쓰기 가능. 단, 자원은 트랜잭션이 독점하며, write 수행 시 shared lock 실행 불가능

2 phase locking protocol(2단계 로킹 규약)

기본 규약은 다음 문제 발생 가능

  • 항상 직렬 가능 스케줄을 보장하지는 못한다.
  • 교착 상태가 발생 가능하다

2단계 로킹 규약은 lock / unlock을 2개 단계로 나눠 수행

  • 확장 단계: 트랜잭션은 lock만 가능
  • 축소 단계: 트랜잭션은 unlock만 가능

트랜잭션이 시작되면 확장 단계가 되면, 하나의 자원이라도 unlock하면 축소 단계로 들어가 자원 할당 불가능

낙관적 검증(optimistic validation)

일단 트랜잭션을 수행한 후, 트랜잭션 종료 시점에 검증하고 데이터베이스에 반영

타임스탬프 순서(time stamp ordering)

트랜잭션, 트랜잭션이 읽거나 갱신한 데이터에 대해 타임 스탬프를 부여하여 시간 순서에 따라 트랜잭션 수행

다중 버전 동시성 제어

트랜잭션 및 데이터의 타임스탬프를 비교, 직렬 가능성이 보장되는 적절한 버전을 선택하여 접근


트랜잭션 회복 기법

용어 정리

  • 회복(Recovery): 장애 발생 시 데이터베이스를 장애 발생 이전 시점으로 복구하는 것
  • 장애(Failure):시스템이 제대로 동작하지 않는 상태

장애 종류

유형 설명 예시
트랜잭션 장애 트랜잭션 수행 중 오류가 발생하여 정상적인 진행이 불가능 논리적 오류, 잘못된 데이터 입력, 시스템 자원 과다 요구, 처리 대상 데이터 부재 등
시스템 장애 하드웨어 결함으로 정상적인 수행이 어려운 상황 메인 메모리 손실, 교착 상태 발생
미디어 장애 디스크 결함으로 데이터베이스의 일부 또는 전부 손상 디스크 헤드 손상 등

회복 연산

별도의 파일 등에 저장해두고, 해당 파일을 기반으로 복구

  • 덤프(dump): DB 전체를 별도의 비휘발성 저장장치에 주기적으로 복사
  • 로그(log): 변경 연산을 실행할 때마다 변경 이전 및 이후 정보를 별도의 파일에 기록

로그 파일: 로그를 저장한 파일로, 로그 레코드 단위로 기록한다. 트랜잭션 수행에 동반되어 손실이 발생하지 않는다.

  • <Ti, START>: 트랜잭션 시작
  • <Ti, X, old, new> : 트랜잭션이 X를 old에서 new로 변경
  • <Ti, COMMIT>: 트랜잭션을 커밋(완료)
  • <Ti, ROLLBACK> 트랜잭션을 철회(실패)

복구 방법

  • REDO(재실행)
    가장 최근 저장된 복사본을 적재한 후, 변경 사항을 로그 기반으로 재실행하여 데이터베이스를 복구
    데이터베이스 비정상 종료 시 Start 및 Commit 기록이 있는 트랜잭션들을 재작업
  • UNDO(취소)
    변경된 내용에 대한 신뢰성을 잃었을 때 로그를 기반으로 실행된 모든 변경 연산을 취소
    데이터베이스 비정상 종료 시 Start는 있지만 Commit이 없는 경우 변경 사항 모두 취소

회복 기법

  • 로그 회복기법
    • 즉시갱신 회복기법:
      트랜잭션 수행 중 데이터 변경 결과를 DB에 즉시 반영
      장애 발생에 대비하기 위해 변경 사항을 로그에 기록(기록 후 DB 반영). 로그 기반 REDO/UNDO 가능
    • 지연갱신 회복기법:
      트랜잭션 수행 동안 로그 파일에만 기록, 완료 후 로그 기반으로 DB에 반영
      완료 이전에는 내용을 작성하지 않으므로 회복 시 로그를 버리면 해결됨
  • 검사 시점(체크포인트) 회복기법: 일정 간격으로 체크포인트를 두고, 해당 시점까지만 회복 수행
  • 그림자 페이징 기법: 트랜잭션 시 복제본을 생성, 장애 발생 시 이를 이용하여 복구 진행

고립 수준(Isolation level)

 다른 트랜잭션이 현재 데이터에 대해 무결성을 해치지 않기 위해 잠금을 설정하는 정도

발생 가능한 문제

  • dirty read:
    트랜잭션이 다른 트랜잭션에 의해 갱신되었으나 아직 커밋되지 않은 행을 검색한다.
  • non repeatable read:
    행을 2번 검색하는 사이에 다른 트랜잭션에 의해 업데이트 + 커밋이 발생, 각 검색이 다른 시점을 가리키는 문제
    두번의 검색 결과는 각각 커밋 이전, 이후의 데이터로, 재현이 불가능함
  • phantom read:
    행을 2번 검색하는 사이에 다른 트랜잭션에 의해 삽입 / 삭제가 발생하여 행이 늘거나 줄어든 것으로 보이는 현상

고립 수준 종류

  • Read Uncommitted: 연산 중인 데이터를 다른 트랜잭션이 읽을 수 있게 허용. dirty read 발생
  • Read Committed: 연산 수행 시 연산이 완료될 때까지 데이터 읽기를 제한.(커밋 완료된 것은 허용)
  • Repeatable Read: 데이터에 대한 읽기/쓰기 잠금을 통해 트랜잭션 종료까지 데이터에 대한 갱신/삭제를 제한
  • Serializable: 데이터에 대한 읽기/쓰기 잠금, WHERE 절에 대한 범위 잠금으로 타 트랜잭션의 접근을 제한