데이터베이스 개론 - 10단원

아빠는 외계연·2022년 12월 1일
0

Database

목록 보기
6/6

10. 회복과 병행 제어

트랜잭션이란?

  • 논리적인 작업의 단위. SQL의 모음
  • 데이터베이스의 무결성과 일관성을 보장한다.
  • 특성
    • ACID
    • 원자성(Atomic)
      • all or nothing
      • 트랜잭션을 구성하는 연산들이 모두 정상적으로 실행되거나 실행되지 않아야 함을 의미
      • 일부만 연산이 처리되는 경우가 발생되면 안된다.
      • 원자성을 보장하기 위해서는 회복기능이 필요하다.
    • 일관성(Consistency)
      • 트랜잭션이 끝난 이후에도 데이터베이스는 일관성을 유지해야 함을 의미한다.
      • 모든 데이터는 규칙에 맞는 일관성을 유지해야 한다.
      • ex) 철수가 10000원을 가지고 영희는 0원을 가지고 있을 때 -> 철수가 영희에게 5000원을 줘도 둘의 돈의 합계는 10000원이다. == 일관성
    • 격리성(Isolation)
      • 한 트랜잭션의 중간 연산 결과에 다른 트랜잭션이 끼어들면 안된다.(접근이 불가능하다)
      • 실제로는 트랜잭션이 병렬적으로 처리가 이루어지지만 사용자는 동시에 트랜잭션이 완료되었다고 생각하게 된다.
    • 지속성(Durability)
      • 트랜잭션이 끝난 후 데이터베이스에 반영된 결과는 영구적이어야 한다.
  • 연산
    • commit
      • 해당 연산을 통해 데이터베이스에 변경사항을 반영한다.
      • 트랜잭션의 수행이 성공적으로 완료되었음을 알린다.
    • rollback
      • 트랜잭션의 수행이 실패하였음을 알린다.
      • 지금까지 수행한 연산의 결과가 모두 취소되고 트랜잭션이 수행되기 전 상태로 복구한다.
  • 상태
    • 활동상태
    • 부분완료 상태(마지막 연산 처리 후 + Commit 전) / 실패 상태 > 장애 발생 시
    • 완료 상태(Commit 후) / 철회 상태(Rollback 후) > 하드웨어 결함이나 SW 오류일 경우에는 트랜잭션이 재 실행, 트랜잭션의 논리적 오류일 경우에는 트랜잭션이 폐기된다.

회복 기법

  • 덤프 : 주기적으로 데이터베이스의 전체를 다른 장소에 복사하는 것
  • 로그 : 데이터베이스의 변경연산이 발생할 때마다 데이터 변경 이전값과 이후값을 별도의 파일에 기록하는 방법. 데이터 손실이 발생되지 않는 저장장치에 저장
  • 연산
    • undo
      • 변경상태를 모두 취소하여 데이터베이스를 원래 상태로 복구
    • redo
      • 변경로그를 다시 재실행
  • 로그 회복 기법
    • 즉시 갱신 회복 기법
      • 트랜잭션 수행 중에 데이터 변경 한 연산의 결과를 데이터베이스에 즉시 반영한다.
      • 로그를 바탕으로 데이터베이스를 복구시킨다.
      • 데이터베이스에 연산을 날리기 전에 로그부터 기록한다.
      • undo 연산 : Commit 연산이 발생하지 않았을 경우
      • redo 연산 : Commit 연산 발생 후
    • 지연 갱신 회복 기법
      • 부분완료 전까지 로그에만 기록했다가 부분완료 시 한번에 데이터베이스에 반영한다.
      • undo 연산이 필요가 없으므로 연산 전의 값을 저장할 필요가 없다.
    • 검사 시점 회복 기법
      • 검사시점(Checkpoint)를 생성하여 장애 발생 시 가장 최근의 검사시점으로 돌아가 그 이후부터 회복작업을 시작한다.

병행 제어

  • 여러 트랜잭션이 같은 데이터에 접근하더라도 정확한 수행결과를 얻을 수 있도록 트랜잭션의 수행을 제어하는 것
  • 인터리빙 : 여러 트랜잭션이 차례로 번갈아서 실행되는 방식
  • 병행 수행의 문제
    • 갱신 분실
      • 하나의 트랜잭션의 연산 결과를 다른 트랜잭션이 덮어써 연산 결과가 무효화되는 것
    • 모순성
      • 트랜잭션이 끝나기 전에 다른 트랜잭션의 수행을 통해 데이터의 값이 변경될 경우 모순된 결과가 발생한다.
    • 연쇄 복귀
      • 트랜잭션 완료 전에 장애가 발생하여 rollback연산이 필요한 경우 해당 값을 가져가 변경연산을 실행한 다른 트랜잭션에도 rollback 연산이 필요하다.
      • 만약 해당 트랜잭션이 연산을 완료한 경우 rollback 연산이 불가능해진다.

트랜잭션 스케줄이란?

  • 트랜잭션의 각 연산을 실행하는 순서
  • 직렬 스케줄
    • 각 트랜잭션 별로 연산을 순차적으로 실행시키는 것
    • 인터리빙 방식을 이용X
    • 각 트랜잭션이 독립적으로 수행된다.
    • 항상 정확한 결과가 도출된다.
    • 병행 수행이라고 할 수 없다.
  • 비직렬 스케줄
    • 인터리빙 방식을 활용해서 트랜잭션을 병행해서 수행하는 방식
    • 하나의 트랜잭션이 완료되기 전에 다른 트랜잭션이 실행될 수 있다.
    • 정확한 결과가 나올지 확신할 수 없다.
  • 직렬 가능 스케줄
    • 비직렬 스케줄 중 정확한 결과를 도출해낼 수 있는 스케줄
    • 인터리빙 방식을 활용하여 트랜잭션을 병행 수행할 수 있음에도 정확한 결과를 도출해낼 수 있다.

병행 제어 기법

  • 직렬 가능성을 보장받기 위해 사용하는 기법
  • 로킹기법
    • lock, unlock 연산을 활용
    • lock : 데이터의 독점권을 가지기 위함
    • unlock : 독점권을 반납하기 위함
    • 상호 배제를 통해 직렬 가능성을 보장
    • 데이터베이스부터 속성까지 다양하게 로킹을 걸 수 있다.
    • 로킹 단위가 작아질 수록 제어가 어렵지만 병행성은 높아진다.
    • 공용 lock
      • 해당 데이터에 read연산이 가능. write 연산은 불가능함. 다른 트랜잭션도 해당 데이터에 lock을 걸 수 있음 -> 데이터에 대한 사용권을 여러 트랜잭션이 가질 수 있음
    • 전용 lock
      • 해당 데이터에 read,write연산 모두 가능. 다른 트랜잭션은 해당 데이터에 lock을 걸 수 없음 -> lock을 건 트랜잭션만 독점권을 가짐
  • 2단계 로킹규약
    • 확장단계 : lock만 걸 수 있고 unlock연산은 실행 불가능한 단계
    • 축소단계 : unlock만 걸 수 있고 lock연산은 실행 불가능한 단계
    • 트랜잭션 시작 시 확장단계부터 시작하며 데이터에 대한 모든 lock이 발생되지 않는 경우 다른 트랜잭션이 lock을 걸 수 없다.
  • 교착상태(deadlock)
    • 상대가 독점하고 있는 데이터에 unlock연산이 실행되기를 바라면서 기다리는 상태
profile
Backend Developer

0개의 댓글