[16장] 트랜잭션 관리 개요

임정환·2023년 6월 11일
0

응용데이터베이스

목록 보기
1/9

동시적인 TX 수행은 DBMS 퍼포먼스 향상에 필수적인 부분이다.
그러나, TX을 동시에 수행한다는 것은 ( 운영체제에서도 알 수 있듯이) 공유된 자원에 대한 동시 접근이다. 이런 동시성 문제를 어떻게 해결할 수 있는지 살펴보자

DBMS의 동시성

  • DBMS에 의해서 동시적인 TX이 제어되고 수행된다. 즉, Record에 대한
    read / write 가 인터리빙하게 일어나고 있다는 뜻이다.
  • 각 TX의 결과로 인해, 데이터베이스의 일관성이 깨지면 안된다.
    ( 운영체제 시간 때 배웠던, 은행 입출금 예시와 같은 문제가 발생되면 안됨 )

Transaction

Read와 Write 연산의 Sequence
Atomic한 연산으로서 , 연산의 도중 crash가 발생했을 경우 roll back 되어야한다.

TX의 원자성

  • TX이 성공적으로 완료될 경우, Commit 을 하게 된다.
  • TX이 실패하였을 경우, Abort 하게 된다.
  • DBMS에 의해서 반드시 TX의 원자성이 보장되어야 한다. 원자성( Atomicity)이란 해당 TX과정은 성공하거나 실패하거나 둘 중 하나밖에 없어야 한다는 뜻이다.
    예를 들자면, (a = a+1) ; ( b= b+2); 와 같은 TX이 존재할때 (a=a+1) 까지만 수행되고 멈출 수 없다는 것
    • DBMS는 log를 통해서 이런 원자성을 보장한다. ( 실패한 TX은 log를 통해서 undo, 즉 처음의 상태로 돌린다는 것 )

TX 스케줄 예시


위와 같은 두개의 TX이 존재할 때

위와 같은 TX plan 들이 가능하다. 여기서 중요한 점은, TX 스케쥴의 결과에 따라서 B나 A의 값이 달라진다는 것이다. 동기화의 중요성을 알 수 있다.

TX 스케쥴링

  • 직렬 스케줄 ( serial schedule )
    TX별 연산을 순차적으로 진행하는 것. Interleaving 하지 않다.
  • 동등 스케줄 ( Equivalent schedule )
    두 TX 스케쥴의 최종 결과가 같다면, 동등 스케줄이라고 한다.
  • 비직렬 스케줄 ( Non-serial schedule )
    인터리빙하게 TX이 실행되는 스케줄이다. 성능은 좋겠지만 , 비일관성 등 여러
    문제를 야기할 수 있다.
  • 직렬 가능 스케줄 ( Serializable schedule )
    비직렬 스케줄이지만 직렬 스케줄처럼 정확한 결과를 내는 TX 스케줄이다.
    인터리빙하게 TX이 진행되므로 성능이 좋고, 비일관성 문제 또한 발생하지 않지만 생각해 볼 점들이 많다.

Lock - based 동시성 제어 기법

  • Strict 2-Phase-Locking Protocol
    각 TX은 어떤 Object에 대해 읽기를 원한다면 S(shared) lock을 획득해야한다.
    어떤 Object에 대해 쓰기를 원한다면 X(exclusive) lock을 획득해야한다.
    TX의 종료 시, 자신이 소유한 lock을 반납해야한다.
    마치, OS에서 배웠던 세마포어와 같은 느낌이다.

TX abort

  • TX이 abort(실패) 됬다면, 모든 TX의 action이 Undo 되어야 한다. 해당 TX만 Undo하는 것이 아니라 abort된 TX을 참조한 다른 모든 TX들 또한 Undo 되어야 한다. DBMS는 log를 통해 Undo를 실행한다.

Log

  • 아래와 같은 action 들이 log에 기록된다.
    • TX이 Object에 대해 write를 할때 : 이전 값과 새로운 값을 기록
      Log 레코드는 page의 변경 전 반드시 Disk에 영속적으로 기록 되어야한다
    • TX이 Object에 대해 commit / abort 할때: 해당 action을 기록
  • Log 레코드는 TX의 id 또한 기록하기에, 로그를 보고 쉽게 TX을 추적할 수 있다.

Crash Recovery

3단계의 충돌회복 알고리즘이 존재한다.

  • Analysis
    가장 최근의 CheckPoint로 부터 Log를 순차적으로 탐색한다. 이를 통해서 , active 하였던 TX을 특정하고 버퍼에 존재하는 dirty page ( 기록이 업데이트 된 )을 특정한다.
  • Redo
    dirty page의 모든 update를 Redo한다.
  • Undo
    Crash 기준, active한 모든 TX을 Undo한다.

마치며

앞으로 알아볼 동시성 제어 기법 , 크래시 리커버리 등에 대해서 간략하게 알아봤다.
다음부터, 상세히 각 기법에 대해 알아보자

profile
CS 박제

0개의 댓글