본문 바로가기

데이터베이스 Database

Chapter 14 회복과 병행 제어

트랜잭션(Transaction)

  • 데이터베이스에 대한 작업의 단위
    • e.g. 은행의 계좌이체, 입금, 계좌조회 / 학사업무 시스템의 수강 신청, 수강조회 등
  • 하나 이상의 SQL문으로 이루어짐
  • 트랜잭션의 특성(property) - ACID 성질
    • 원자성(atomicity): 전부 아니면 전무(all or nothing)
    • 일관성(consistency)
    • 격리성(isolation)
    • 영속성(durability)

트랜잭션의 종료

  • 트랜잭션의 종료는 다음 중 하나가 되어야 함
    • Commit
      • 트랜잭션의 성공적인 종료를 나타냄
      • 트랜잭션 수행 도중 변경된 내용은 반드시 영속적으로 저장되어야 함
    • Rollback
      • 트랜잭션이 실패하였음을 나타냄
      • 트랜잭션의 실행 이전 상태로 데이터베이스의 상태가 복구되어야 함

트랜잭션의 상태

  • 활동(active): 실행 중인 상태
  • 부분 완료(partially committed): 마지막 명령문을 실행한 직후
  • 실패(failed): 정상적인 실행이 불가능하여 중단된 상태
  • 철회(aborted): 실행 실패로 인해 rollback을 수행한 상태
  • 완료(committed): 성공적으로 완료하여 commit을 수행한 상태

트랜잭션 종료를 명확히 나타낸 예

BEGIN_TRANS:
	update ACCOUNT
    	set balance = balace - 100
    	where accout_id = 'A';
    	IF ERROR GO TO UNDO;
    
    	update ACCOUNT
    	set balance = balance + 100
    	where account_id = 'B';
    	IF ERROR GO TO UNDO;
    
    	COMMIT TRANS;
    	GO TO FINISH;
    UNDO:
	ROLLBACK TRANS;
    FINISH:
	RETURN;
END_TRANS;

 

트랜잭션 기능 제공을 위한 DBMS 기능

  • 회복(recovery) 또는 고장회복
    • DBMS에 장애가 발생하였을 때, 장애 발생 이전의 일관된 상태(consistent state)로 데이터베이스의 상태를 복원시키는 기능
    • 트랜잭션의 원자성, 일관성, 지속성을 보장
  • 병행 제어(concurrency control)
    • 데이터베이스를 동시에 접근하는 트랜잭션들 간의 상호 간섭으로 인해 잘못된 데이터가 발생하지 않도록 제어하는 기능
    • 트랜잭션의 격리성, 일관성, 지속성을 보장

DBMS의 쓰기

강의 자료 참고

 

장애(failure): 논리적 오류, S/W 및 H/W 오류, 고장 등으로 정상적인 실행이 불가능한 상태

  • 트랜잭션 장애: 개별 트랜잭션 수준에서 문제 발생으로 트랜잭션이 정상적으로 수행될 수 없는 상태
  • 시스템 장애: DBMS 서버 수준에서 문제가 발생하여 서버가 정상적으로 수행될 수 없게 된 상태
  • 미디어 장애: 데이터베이스 저장소(디스크)에 문제가 발생하여 데이터를 사용할 수가 없게 된 상태

트랜잭션에 장애가 발생했을 때의 문제점

커밋하지 않은 트랜잭션이 갱신한 데이터를 모두 이전 상태로 돌려야 함

  • DB서버가 즉시 갱신(immediate update) 정책을 사용하면 문제가 발생할 수 있음
    • 즉시 갱신: 커밋되지 않은 트랜잭션의 데이터가 데이터베이스에 기록될 수 있도록 하는 것으로, 결과적으로 미완료 갱신을 유발
  • 미완료 갱신(uncommitted update): 즉시 갱신에 의해 데이터베이스에 기록된 데이터

시스템 장애가 발생했을 때의 문제점

  • 미완료 갱신을 이전 상태로 돌려야 함
  • 커밋된 데이터나 지연 갱신으로 인해 반영되지 못한 데이터에 대해 커밋된 데이터로 기록해야 함
    • 지연 갱신 정책(deferred update policy)
      • 트랜잭션이 커밋 시점에 갱신한 데이터를 디스크에 기록하지 않고 나중에 기록하는 것
      • 결과적으로 성공적으로 종료(커밋)한 트랜잭션의 데이터가 디스크에 기록되지 않을 수 있음

미디어 장애가 발생했을 때의 문제점

  • 데이터베이스에 접근할 수 없음
  • 가장 최근의 데이터베이스를 새로 만들어야 함

 

회복

  • 회복 원리
    • 데이터 중복(data redundancy)을 이용
      • 덤프(dump)
        • 데이터베이스 전체를 주기적으로 복제
      • 저널(journal) 또는 로그(log)
        • 변경되는 레코드(또는 페이지)의 변경 이전값과 이후값을 저장
        • 로그 저장소는 장애가 발생해서는 안 됨
  • 회복 관리자(recovery manager)
    • DBMS 서버 내의 한 모듈로 장애 발생 탐지 및 고장 회복 기능을 담당

로그 레코드의 예

<T, Start>: 트랜잭션 T의 시작을 기록

<T, X, V(old), V(new)>: 트랜잰션 T에서 데이터 X를 V(old) 값에서 V(new) 값으로 변경한 사실을 기록

<T, Commit>: 트랜잭션 T의 commit 사실을 기록

<T, Rollback>: 트랜잭션 T의 rollback 사실을 기록

 

로그 및 데이터베이스의 백업

  • 데이터베이스의 백업
    • 온라인 데이터베이스(online database)
      • 현재 온라인으로 사용 중인 데이터베이스
    • 보존 데이터베이스(archival database)
      • 일정 시점에서 데이터베이스 전체를 백업 받은 것
      • 테이프 등의 3차 저장장치에 보관
  • 로그의 백업
    • 온라인 로그(online log)
      • 현재 온라인으로 사용 중인 로그
    • 보존 로그(archival log)
      • 온라인 로그를 일정 시점에 백업한 것
      • 온라인 로그의 크기를 줄일 수 있음

로그를 사용한 회복

강의 자료 참고

 

트랜잭션 실행 예

강의 자료 참고

 

로그의 분석 및 적용

로그의 시작점부터 검사하여

  • <T, Start> 로그만 있고 <T, Commit>이 없으면 T에 대해서는 UNDO(T)를 실행
    • UNDO(T): 트랜잭션 T의 모든 로그레코드에서 OLD 값을 데이터베이스에 적용
  • <T, Start>와 <T, Commit>이 모두 있으면 REDO(T)를 수행
    • REDO(T): 트랜잭션 T의 모든 로그레코드에서 NEW 값을 데이터베이스에 적용

검사점 회복

  • 시스템 장애에 대한 고장회복 시 로그를 처음부터 읽고 REDO와 UNDO를 수행해야 함
    → 고장회복에 소요되는 시간 大
    → 불필요한 REDO 실행
  • 검사점(checkpoint)
    • 주기적으로 버퍼 내에 존재하는 갱신된 페이지를 모두 디스크에 기록(flush)
    • <Checkpoint> 로그를 기록
  • 검사점 회복
    ① 고장회복 시 로그를 뒤에서부터 읽음
    ② <Checkpoint> 로그를 발견하면
    ③ <Checkpoint> 이후의 로그들에 대해서만 REDO와 UNDO를 수행

 

트랜잭션의 병행 수행(Concurrent Execution)

  • 다수의 트랜잭션을 동시에 수행하는 것
    • 서로 다른 트랜잭션 내의 연산들이 뒤섞여 실행
  • 트랜잭션들 간의 데이터 충돌(conflict)로 인해 문제가 발생할 수 있음
    • 갱신 분실(lost update): 강의 자료 참고
    • 데이터 모순(data inconsistency): 강의 자료 참고
    • 연쇄 롤백(cascading rollback): 강의 자료 참고

병행 제어(Concurrency Control)

  • 다수의 트랜잭션을 병행 수행하더라도 문제가 발생하지 않도록 트랜잭션 실행을 관리하는 기법
    • 잠금(Locking) 기법이 대표적
  • 잠금 관리자(lock manager): 잠금 기능을 관리하는 DBMS 서버 내의 모듈

잠금(Locking) 기법

  • 접근하는 데이터에 대해 잠금(lock)과 잠금해제(unlock)를 사용
  • 잠금의 종류
    • 공유 잠금(shared-lock, S-lock): 공유 잠금을 요청한 트랜잭션들 간에는 동시에 데이터를 접근할 수 있음
    • 배타적(전용) 잠금(exclusive-lock, X-lock): 오직 하나의 트랜잭션만이 데이터에 접근할 수 있음

잠금을 사용한 예

강의 자료 참고

 

2단계 잠금 규약

  • 2 Phase Locking protocol(2PL)
  • 트랜잭션의 2단계로 잠금을 사용함
    • 확장 단계(growing phase): 트랜잭션은 lock만 가능하고 unlock은 불가
    • 축소 단계(shrink phase): 트랜잭션은 unlock만 가능하고 lock은 불가
  • 즉, unlock을 시작하면 lock을 할 수 없음

2PL의 예

강의 자료 참고