[Database System] 회복과 병행 제어

이현준·2020년 12월 14일
2

Database System

목록 보기
6/6
post-custom-banner

트랜잭션의 개념

하나의 작업을 수행하기 위해 필요한 데이터베이스 연산들을 모아놓은 것으로, 논리적인 작업의 단위

트랜잭션의 특징

  1. 원자성 : 트랜잭션의 연산이 모두 수행되거나 하나도 수행되지 않아야 한다.
  2. 일관성 : 트랜잭션이 수행 후에도 데이터베이스가 일관성이 있는 상태여야 한다.
  3. 격리성 : 수행 중인 트랜잭션이 완료될 때까지 다른 트랜잭션들이 중간 연산 결과에 접근할 수 없다.
  4. 지속성 : 트랜잭션의 수행이 완료된 후에 데이터베이스에 반영한 결과는 영구적이어야 한다.

트랜잭션의 연산

  • commit 연산 : 작업 완료
  • rollback 연산 : 작업 취소

트랜잭션의 상태

  • 활동 상태 : 트랜잭션이 수행을 시작하여 현재 수행 중인 상태다.
  • 부분 완료 상태 : 트랜잭션의 마지막 연산이 실행을 끝낸 직후의 상태다.
  • 완료 상태 : 트랜잭션이 성공적으로 완료되어 commit 연산을 실행한 상태다.
  • 실패 상태 : 장애가 발생하여 트랜잭션의 수행이 중단된 상태다.
  • 철회 상태 : 트랜잭션의 수행 실패로 rollback 연산을 실행한 상태다

장애의 정의와 유형

시스템이 제대로 동작하지 않는 상태다. 트랜잭션 장애, 시스템 장애, 미디어 장애가 있다.

회복의 정의와 연산

장애가 발생했을 때 데이터베이스를 장애가 발생하가 전의 일관된 상태로 복구시키는 것이다. redo(재실행), undo(취소) 연산이 있다.

회복 기법의 유형

  • 로그 회복 기법 : 로그를 이용한 회복이다.
  • 검사 시점 회복 기법 : 검사 시점을 이용한 회복이다.
  • 미디어 회복 기법 : 데이터베이스 덤프(복사본)을 이용한 회복이다.

로그 회복 기법

로그를 이용한 회복 기법으로, 즉시 갱신 회복과 지연 갱신 회복이 있다.

  • 즉시 갱신 회복, 트랜잭션을 수행하는 도중에 데이터 변경 연산의 결과를 데이터베이스에 즉시 반영한다.
  • 지연 갱신 회복, 트랜잭션이 부분 완료되면 데이터 변경 연산의 결과를 데이터베이스에 한번에 반영한다.

병행수행과 병행 제어

병행 수행

여러 개의 트랜잭션을 동시에 수행하는 것으로, 갱신 분실, 모순성, 연쇄 복귀의 문제가 있다.

병행 제어

병행 수행 시 문제가 발생하지 않고 정확한 결과를 얻을 수 있도록 트랜잭션의 수행을 제어하는 것이다.

트랜잭션 스케줄

직렬 스케줄

인터리빙 방식을 이용하지 않고 각 트랜잭션별로 연산들을 순차적으로 실행시키는 것이다.
모든 트랜잭션이 다른 트랜잭션의 방해를 받지 않고 독립적으로 수행되기 때문에 항상 모순 없는 결과를 얻는다. 하지만 인터리빙, 트랜잭션들이 동시에 수행되는 병행 수행이 없기 때문에 일반적으로 사용하지 않는다.

비직렬 스케줄

인터리빙 방식을 이용하여 트랜잭션을 병행해서 수행시키는 것이다. 트랜잭션이 돌아가면서 연산들을 실행하기 때문에 하나의 트랜잭션이 완료되기 전에 다른 트랜잭션의 연산이 실행될 수 있다. 그렇기 때문에 갱신 분실, 모순성, 연쇄 복귀 등의 문제가 발생할 수 있어 최종 수행 결과의 정확성을 보장할 수 없다.

직렬 가능 스케줄

직렬 스케줄에 따라 수행한 것과 같이 정확한 결과를 생성하는 비직렬 스케줄이다. 모든 비직렬 스케줄이 직렬 가능한 것은 아니다. 비직렬 스케줄 중에서 수행 결과가 동일한 직렬 스케줄이 없는 것들은 결과의 정확성을 보장할 수 없으므로 직렬 가능 스케줄이 아니다.

직렬 가능 스케줄 여부를 판단하는 일은 쉽지 않다. 그래서 검사하기 보다는 직렬 가능성을 보장하는 병행 제어 기법을 사용한다.

병행 제어 기법

여러 트랜잭션을 병행 수행하면서도 정확한 결과를 얻을 수 있는 직렬 가능성을 보장받기 위해 사용한다.

원리

모든 트랜젹션이 따르면 직렬 가능성이 보장되는 나름의 규약을 정의하고, 트랜잭션들이 이 규약을 따르도록 하는 것이다. 그러면 해당 스케줄의 직렬 가능성을 보장할 수 있다.

가장 많이 사용되는 병행 제어 기법인 로킹기법에 대해 알아보자

로킹 기법

Lock, Unlock

한 트랜잭션이 먼저 접근한 데이터에 대한 연산을 모두 마칠 때까지, 해당 데이터에 다른 트랜잭션이 접근하지 못하도록 상호 배제하여 직렬 가능성을 보장하는 것이다.

Lock 연산

트랜잭션이 사용할 데이터에 대한 독점권을 가지기 위해 사용한다.

Unlock 연산

트랜잭션이 데이터에 대한 독점권을 반납하기 위해 사용한다.

2단계 로킹 규약

  • lock, unlock뿐 아니라 이 2단계 로킹 규약까지 준수해야 해당 스케줄의 직렬 가능성이 보장된다.

2단계 로킹 규약을 따르려면 모든 트랜잭션이 lock과 unlock연산을 다음과 같이 2단계로 나누어 실행해야 한다.

1. 확장 단계

트랜잭션이 lock연산만 실행할 수 있고, unlock 연산은 실행할 수 없는 단계

2. 축소 단계

트랜잭션이 unlock연산만 실행할 수 있고, lock 연산은 실행할 수 없는 단계

간단히 말하면 처음 lock만한다가 한번이라도 unlock하게 되면 계속 unlock만 해야됨

이를 통해 직렬 가능성을 보장할 수 있다. 하지만 교착상태가 발생할 수 있어 이에 대한 해결책이 필요하다.

교착 상태란?

트랜잭션들이 상대가 독점하고 있는 데이터에 unlock연산이 실행되기를 서로 기다리면서 트랜잭션의 수행을 중단하고 있는 상태다. 교착 상태에 빠지면 트랜잭션들은 더 이상 수행을 계속하지 못하고 상대 트랜잭션이 먼저 unlock 연산을 실행해주기를 한없이 기다리게 된다.

예를 들어 트랜잭션 T1과 T2가 모두 데이터 X와 데이터 Y에 접근하는 상황을 생각해보자. 트랜잭션T1이 T2가 lock한 데이터 X에 접근하기 위해 T2 unlock 연산을 실행해주기를 기다리고 있고 T2는 T1이 lock한 데이터 Y에 접근하기 위해 T1이 unlock연산을 실행해주기를 기다리고 있다면 교착상태가 된다.

교착 상태는 처음부터 발생하지 않도록 예방하거나, 발생했을 때 빨리 탐지하여 필요한 조치를 취하는 방법으로 해결한다.

post-custom-banner

0개의 댓글