트랜잭션

이다연·2023년 6월 10일

DB

목록 보기
7/7

트랜잭션

1. 트랜잭션의 개념

-1. 트랜잭션

  • 트랜잭션을 관리함으로써 데이터베이스의 회복과 병행 제어 가능해져서 데이터베이스가 일관된 상태를 유지할 수 있게함
  • 작업 하나를 수행하는데 필요한 데이터베이스의 연산들을 모아놓은 것
  • 데이터베이스에서 논리적인 작업의 단위
  • 작업 수행에 필요한 SQL문들의 모임

2. 트랜잭션의 특성

-1. 원자성

  • 트랜잭션을 구성하는 연산들이 모두 정상적으로 실행되거나 하나도 실행되지 않아야 함
  • 트랜잭션 수행하다가 장애 발생 -> 지금까지 실행한 연산 처리를 모두 취소하고 데이터베이스를 트랜잭션 작업 전의 상태로 되돌려 원자성 보장해야 함 -> 회복 기능 필요

-2. 일관성

  • 트랜잭션이 성공적으로 수행된 후에도 데이터베이스가 일관된 상태를 유지해야 함 -> 병행 제어 기능 필요

-3. 고립성

  • 현재 수행 중인 트랜잭션이 완료될 때까지 트랜잭션이 생성한 중간 연산 결과에 다른 트랜잭션들이 접근할 수 없음 -> 병행 제어 기능 필요

-4. 지속성

  • 트랜잭션이 성공적으로 완료된 후 데이터베이스에 반영한 수행 결과는 영구적이어야 함 -> 회복 기능 필요

3. 트랜잭션의 연산

-1. commit

  • 트랜잭션이 성공적으로 수행되었음을 선언(작업 완료)
  • commit연산 실행 후 트랜잭션의 수행 결과가 데이터베이스에 반영 -> 데이터베이스가 일관된 상태를 지속적으로 유지

-2. rollback

  • 트랜잭션을 수행하는데 실패했음을 선언(작업 취소)
  • 지금까지 실행한 연산의 결과 취소, 트랜잭션이 수행되기 전의 상태로 돌아감

4. 트랜잭션의 상태

-1. 활동 상태

  • 트랜잭션이 수행되기 시작해서 현재 수행 중인 상태
  • 상황에 따라 부분 완료 상태나 실패 상태가 됨

-2. 부분 완료 상태

  • 트랜잭션의 마지막 연산이 실행된 직후의 상태
  • 트랜잭션의 모든 연산을 처리했지만 최종 결과를 데이터베이스에 반영하지 않은 상태
  • 상황에 따라 완료 상태나 실패 상태가 됨

-3. 완료 상태

  • 트랜잭션이 성공적으로 완료되어 commit연산을 실행한 상태
  • 트랜잭션이 수행한 최종 결과를 데이터베이스에 반영, 데이터베이스가 새로운 일관된 상태가 되면서 트랜잭션이 종료됨

-4. 실패 상태

  • 트랜잭션의 수행이 중단된 상태

-5. 철회 상태

  • 트랜잭션을 수행하는데 실패하여 rollback연산을 실행한 상태
  • 지금까지 실행한 트랜잭션의 연산을 모두 취소하고 트랜잭션이 수행되기 전의 데이터베이스 상태로 되돌리면서 트랜잭션이 종료됨

장애와 회복

1. 장애의 유형

2. 데이터베이스의 저장 연산

  • 저장 장치는 장애가 발생했을때 대응하는 방법에 따라 분류함
  • 데이터베이스는 비휘발성 저장 장치인 디스크에 상주함
  • 트랜잭션이 데이터를 처리할 때 데이터를 디스크에서 메인 메모리로 가져와 이를 처리한 후 그 결과를 다시 디스크로 보내는 작업이 필요함
  • 디스크 <-> 메인 메모리 간의 데이터 이동은 블록 단위로 수행
  • 디스크에 있는 블록: 디스크 블록
  • 메인 메모리에 있는 블록: 버퍼 블록
  • 응용 프로그램에서 트랜잭션의 수행 지시하면 메인 메모리 버퍼 블록에 있는 데이터를 프로그램의 변수로 가져오고, 데이터 처리 결과를 저장한 변수값을 메인 메모리 버퍼 블록으로 옮기는 작업이 추가로 필요함
  • input 연산 후 -> read 연산 후 -> write연산 후 -> output연산 수행

-1. 디스크와 메인 메모리간의 데이터 이동 연산

  • input(X): 디스크 블록에 저장되어 있는 데이터 x를 메인 메모리 버퍼 블록으로 이동시키는 연산
  • output(X): 메인 메모리 버퍼 블록에 있는 데이터 x를 디스크 블록으로 이동시키는 연산

-2. 메인 메모리의 버퍼 블록과 프로그램 변수 간의 데이터 이동 연산

  • read(X): 메인 메모리 버퍼 블록에 저장되어 있는 데이터 x를 프로그램의 변수로 읽어오는 연산
  • write(X): 프로그램의 변수 값을 메인 메모리 버퍼 블록에 있는 데이터 x에 기록하는 연산

3. 회복 기법

  • 데이터베이스에 장애가 발생했을 때 장애가 발생하기 전의 모순이 없고 일관된 상태로 복구시키는 것

-1.회복을 위한 연산

  • 덤프
    • 데이터베이스 전체를 다른 저장 장치에 주기적으로 복사하는 방법
  • 로그
    • 데이터베이스에서 변경 연산이 실행될 때마다 데이터를 변경하기 이전 값과 변경한 이후 값을 별도의 파일에 기록하는 방법
    • 로그 파일(로그를 저장한 파일)은 레코드 단위로 기록
    • 데이터베이스에 대한 변경 연산 -> 트랜잭션 단위로 실행되므로 로그 레코드도 트랜잭션의 수행과 함께 기록됨
  • 덤프나 로그방법으로 데이터베이스를 복구하는 방법 -> undo, redo연산 사용
  • redo(재실행)
    • 가장 최근에 저장한 데이터베이스 복사본을 가져온 후 로그를 이용해 복사본이 만들어진 이후에 실행된 모든 변경 연산을 재실행하여 장애가 발생하기 직전의 데이터베이스 상태로 복구
  • undo(취소)
    • 로그를 이용해 지금까지 실행된 모든 변경 연산을 취소하여 데이터베이스를 원래의 상태로 복구
  • 로그 레코드
    • <T, start>: 트랜잭션 T가 수행을 시작함
    • <T, X, old_value, new_value>: 트랜잭션 T가 데이터 X를 이전값 old_value에서 새로운 값 new_value로 변경하는 연산을 실행했음을 기록
    • <T, commit>: T가 성공적으로 완료되었음을 기록
    • <T, abort>: T가 철회되었음을 기록

-2. 로그 회복 기법

  • 즉시 갱신 회복 기법
    • 트랜잭션 수행 중에 데이터를 변경한 연산의 결과를 데이터베이스에 즉시 반영
    • 데이터 변경에 대한 내용 로그 파일에도 기록(장애 발생 대비)
    • 트랜잭션이 완료되기 전 장애가 발생한 경우
      (로그 파일에 <T, start> 로그 레코드는 존재하지만 <T, commit> 로그 레코드는 존재하지 않는 상태) -> undo연산 실행
    • 트랜잭션이 완료된 후 장애가 발생한 경우
      (로그 파일에 <T, start>로그 레코드와 <T, commit>레코드가 모두 존재하는 상태) -> redo연산 실행
    • undo, redo연산 둘다 필요한 경우 -> undo 연산 먼저 실행 후 redo연산 실행
  • 지연 갱신 회복 기법
    • 트랜잭션이 수행되는 동안 데이터 변경 연산의 결과를 데이터베이스에 즉시 반영하지 않고 로그 파일에만 기록했다가, 트랜잭션이 부분 완료된 후에 로그에 기록된 내용을 이용해 데이터베이스에 한 번에 반영
    • redo연산만 필요함 -> 변경 연산 실행에 관한 로그 레코드는 <T, X, new_value> 형식으로 기록됨
    • 트랜잭션이 완료되기 전에 장애가 발생한 경우 -> 로그 내용을 무시하고 버림
    • 트랜잭션이 완료된 후 장애가 발생한 경우 -> redo연산 실행

-3. 검사 시점 회복 기법

  • 로그 전체를 대상으로 회복 기법 적용하면 비효율적임 -> 일정 시간 간격으로 checkpoint만들어둠 -> 장애가 발생하면 checkpoint이전의 트랜잭션에는 회복 작업을 수행하지 않고 이후의 트랜잭션에만 회복 작업 수행

병행제어

1. 병행 수행과 병행 제어

  • 데이터베이스 관리 시스템은 여러 사용자가 데이터베이스를 동시에 공유할 수 있도록 여러개의 트랜잭션이 동시에 수행되는 병행수행 지원
  • 병행수행은 인터리빙(여러개의 트랜잭션이 번갈아 수행됨) 방식으로 진행됨
  • 동시성 제어 : 여러 개의 트랜잭션이 병행 수행되면서 같은 데이터에 접근해서 연산을 실행해도, 문제가 발생하지 않고 정확한 수행 결과를 얻을 수 있도록 트랜잭션의 수행을 제어하는 것

2. 병행 수행의 문제

-1. 갱신 분실

  • 하나의 트랜잭션이 수행한 데이터 변경 연산의 결과를 다른 트랜잭션이 덮어써 변경 연산이 무효화되는 것

-2. 모순성

  • 하나의 트랜잭션이 여러 개의 데이터 변경 연산을 실행할 때 일관성 없는 상태의 데이터베이스에서 데이터를 가져와 연산을 실행함으로써 모순된 결과가 발생하는 것

-3. 연쇄 복귀

  • 장애가 발생한 트랜잭션이 rollback연산을 실행하기 전에 변경한 데이터를 가져가 사용하는 다른 트랜잭션이 수행을 완료해버려서 rollback연산을 실행할 수 없어 발생하는 문제

3. 트랜잭션 스케줄

  • 트랜잭션에 포함되어 있는 연산들을 수행하는 순서

-1. 직렬 스케줄

  • 인터리빙 방식을 이용하지 않고 트랜잭션별로 연산들을 순차적으로 실행시키는 것
  • 모든 트랜잭션이 완료될 때 까지 다른 트랜잭션의 방해를 받지 않고 독립적으로 수행
  • 정확한 결과를 얻을 수 있지만 인터리빙 방식을 사용하지 않고 각 트랜잭션을 독립적으로 수행하기 때문에 병행 수행이라고 할 수 없음

-2. 비직렬 스케줄

  • 인터리빙 방식을 이용하여 트랜잭션을 병행해서 수행시키는 것
  • 갱신 분실, 모순성, 연쇄 복귀 등의 문제가 발생할 수 있음

-3. 직렬 가능 스케줄

  • 직렬 스케줄에 따라 수행한 것과 같이 정확한 결과를 생성하는 비직렬 스케줄
  • 직렬 가능성을 보장하는 병행 제어 기법 사용

4. 병행 제어 기법

  • 직렬 가능성이 보장되는 규약 정의 -> 트랜잭션들이 이 규약을 따르도록 함

-1. 로킹 기법

  • 병행 수행되는 트랜잭션들이 동일한 데이터에 동시에 접근하지 못하도록 lock, unlock 연산 통해 제어
  • 한 트랜잭션이 먼저 접근한 데이터에 대한 연산을 마칠 때까지 해당 데이터에 다른 트랜잭션이 접근하지 못하도록 상호배제 하여 직렬 가능성을 보장하는 것
  • lock: 트랜잭션이 사용할 데이터에 대한 독점권을 가짐
  • unlock: 트랜잭션이 데이터에 대한 독점권을 반납
  • 로킹단위: lock연산을 실행하는 대상 데이터의 크기 -> 로킹 단위가 작아질수록 제어가 어렵지만 병행성은 높아짐/ 로킹 단위가 커질수록 제어는 쉽지만 병행성은 낮아짐
  • lock연산
    • 공용lock: 해당 데이터에 read연산 o, write연산 x, 다른 트랜잭션도 공용 lock연산 동시에 수행 o
    • 전용lock: read o, write o, 다른 트랜잭션 lock연산 동시에 수행x, unlock연산 실행될 때까지 기다려야 함
  • 다른 트랜잭션이 변경하기 전에 접근해서 모순된 결과가 생길 수 있음 -> 기본 로킹 규약으로는 트랜잭션 스케줄의 직렬 가능성을 보장하기에 부족함
  • lock와 unlock연산을 실행하는 시점에 새로운 규약 추가 필요

-2. 2단계 로킹 규약

  • lock와 unlock연산을 실행하는 시점에 새로운 규약 추가
  • 2단계 로킹 규약을 준수하면 직렬 가능성 보장
  • 확장 단계: 트랜잭션이 lock연산만 실행할 수 있고 unlock연산은 실행할 수 없는 단계
  • 축소 단계: 트랜잭션이 unlock연산만 실행할 수 있고 lock연산은 실행할 수 없는 단계
  • 트랜잭션 수행 -> 확장 단계로 들어감 -> lock 연산만 실행할 수 있음 -> unlock연산 수행 -> 축소 단계로 들어감 -> unlock연산만 실행할 수 있음
  • 2단계 로킹 규약을 준수하는 트랜잭션은 첫 번째 unlock연산을 실행하기 전에 필요한 모든 lock연산을 실행해야 함
  • 하지만 교착상태가 발생할 수 있음

0개의 댓글