본문으로 바로가기

[DB] 3. 트랜잭션 (Transaction)

category CS/Database 2019. 1. 20. 21:51
3_트랜잭션

3. 트랜잭션 (Transaction)

  1. 트랜잭션이란?
  2. 트랜잭션의 성질 (ACID)
  3. 트랜잭션의 상태
  4. 트랜잭션 스케줄 (Schedule)
  5. 트랜잭션 회복 (Recovery)
  6. 병행제어 (Concurrency Control)
  7. 교착 상태 (Deadlock)

 

1. 트랜잭션이란?

1.1. 트랜잭션의 정의

  • 하나의 논리적 기능을 수행하기 위한 연산의 집합

COMMIT 연산

  • 트랜잭션이 정상적으로 종료되어 변경 내용을 DB에 반영하는 연산

ROLLBACK 연산

  • 트랜잭션이 비정상적으로 종료되어 일관성이 깨졌을 때, 모든 작업을 이전으로 돌리는 연산

 

1.2. 트랜잭션의 필요성

  • 현금 인출기를 사용하는 도중에 예기치 않은 상황이 발생하여 기계가 멈추는 경우
  • 같은 계좌로 동시에 돈을 인출할 때, 두번째로 인출한 경우가 먼저 인출되어 저장된 잔액을 덮어쓰는 경우
  • 위와 같은 상황이 발생하지 않도록, 트랜잭션의 ACID 성질을 제공받기 위해서 트랜잭션을 사용함

 

 

2. 트랜잭션의 성질

2.1. Atomicity (원자성)

  • 트랜잭션의 연산은 DB에 모두 반영되거나 모두 반영되지 않아야함

2.2. Consistency (일관성)

  • 트랜잭션 수행이 완료되면 언제나 일관성 있는 데이터베이스 상태로 변환
  • 트랜잭션 수행 전과 후의 일관성 유지

2.3. Isolation (독립성)

  • 한 트랜잭션이 완료되기 전까지는 다른 트랜잭션이 갱신 중인 데이터에 접근할 수 없음
  • 여러 트랜잭션이 수행되더라도 결과는 순차적 이어야함

2.4. Durability (영속성)

  • 트랜잭션 작업이 완료되었다면 결과는 영구적으로 반영되어야함

 

 

3. 트랜잭션의 상태

3.1. Active

  • 트랜잭션이 실행 중인 상태

3.2. Failed

  • 트랜잭션이 실행 중에 오류 발생으로 인해 중단된 상태

3.3. Aborted

  • 트랜잭션이 비정상적으로 종료되어 ROLLBACK 연산을 수행한 상태

3.4. Partially Committed

  • 트랜잭션의 마지막 연산까지 수행하였지만 COMMIT 연산을 수행하기 전의 상태

3.5. Committed

  • 트랜잭션이 정상적으로 완료되어 COMMIT 연산을 수행한 상태

 

 

4. 트랜잭션 스케줄

동시에 여러개의 트랜잭션들이 병행 실행되는 경우, 연산들이 실행되는 순서

 

4.1. 직렬 (Serial) 스케줄

  • 트랜잭션을 순차적으로 수행하는 방식

4.2. 비직렬 (Non-Serial) 스케줄

  • 각 트랜잭션의 연산을 번갈아가며 수행

4.3. 직렬가능 (Serializable) 스케줄

  • 직렬, 비직렬 스케줄 기법의 결과가 동일한 경우

 

 

5. 트랜잭션 회복

손상된 DB를 손상되기 이전의 상태로 복구시키는 작업

 

5.1. 로그 (Log)

  • 트랜잭션이 수행되어 변경되는 DB의 정보를 기록
  • REDO : 로그의 내용을 토대로 재수행하여, 변경된 내용을 DB에 반영하는 작업 (Commit)
  • UNDO : 비정상적으로 종료되는 경우, 트랜잭션이 시작된 지점으로 복귀 (Rollback)

 

5.2. 회복 기법

  • 즉시 갱신

    • 변경되는 내용을 즉시 DB에 적용
  • 지연 갱신

    • 트랜잭션이 부분완료가 되면 DB에 적용
  • 검사 시점

    • 트랜잭션 실행 중간에 검사 시점을 설정하여, 검사 시점까지 수행한 후 DB에 적용
  • 그림자 페이지

    • 로그를 사용하지 않고, DB를 동일한 크기의 단위인 페이지로 나누어 각 페이지마다 복사하여 그림자 페이지를 보관
    • 장애 발생 시, 그림자 페이지를 이용하여 회복

 

 

6. 병행 제어 (Concurrency Control)

동시에 여러 트랜잭션을 병행 수행할 때, 트랜잭션들의 일관성을 파괴하지 않도록 제어하는 기술

 

6.1. 병행제어 기법과 종류

  • 로킹 제어 기법

    • 데이터베이스 관리에서 하나의 트랜잭션에 LOCK 을 걸어 사용되는 데이터를 다른 트랜잭션이 접근하지 못하도록 제어하는 기법
    • 로킹단위가 커지면 오버헤드는 감소하지만 병행성이 낮아지고, 로킹단위가 작아지면 오버헤드는 증가하지만 병행성이 높아진다
  • 2단계 LOCKING 규약

    • 트랜잭션 스케줄의 직렬성을 보장하는 대표적인 잠금 기법
    • 확장 단계 : 트랜잭션이 잠금만 수행할 수 있고, 잠금 해제는 수행할 수 없는 단계
    • 수축 단계 : 트랜잭션이 잠금 해제만 수행할 수 있고, 잠금은 수행할 수 없는 단계
  • 타임 스탬프 순서 기법

    • 트랜잭션이 시스템으로 들어오면 그 때의 시스템 시간 값을 트랜잭션의 타임 스탬프로 부여
    • 직렬성 순서를 결정하기 위한 가장 보편적인 방법

 

6.2. 로킹의 접근허용

  • 공유락 (Shared Lock)

    • 사용중인 데이터를 다른 트랜잭션이 Read O , Write X
  • 배타락 (Exclusive Lock)

    • 사용중인 데이터를 다른 트랜잭션이 Read X , Write X

 

6.3. 병행제어를 하지 않았을 때의 문제점

  1. 갱신 분실 (Lost Update)

    • 연산 결과의 일부가 없어지는 현상
  2. 모순성 (Inconsistency)

    • 연산의 결과가 일관성이 결여된 현상
  3. 연쇄 복귀 (Cascading Rollback)

    • 하나의 트랜잭션의 취소로 인해 다른 트랜잭션도 취소되는 현상
  4. 비완료 의존성 (Uncommitted Dependency)

    • 하나의 트랜잭션의 수행이 실패한 후 회복되기 이전에, 다른 트랜잭션이 실패한 결과를 참조하는 현상

 

 

7. 교착 상태 (Deadlock)

T1 : write(A) read(B)

T2 : read(B) read(A)

위와 같은 트랜잭션이 있다고 가정할 때, T1은 A를 lock하고 B의 lock해제를 기다리고 있다.

또한 T2는 B를 lock하고 A를 기다리고있다. 이처럼 각 트랜잭션이 서로의 자원을 획득하기위해 기다리고 있는 상태를 교착 상태 라고한다.

즉, 트랜잭션들이 실행을 전혀 진전시키지 못하는 무한 대기 상태 에 빠져있는 상태를 말한다.

 

7.1. 교착 상태의 예방

  • 상호배제 조건의 제거
  • 점유와 대기 조건의 제거
  • 비선점 조건의 제거
  • 환형 대기 조건의 제거

 

7.2. 교착 상태의 회피

자원이 어떻게 요청될지에 대한 추가정보를 제공하도록 요구하는 것으로, 시스템에 Circular Wait 가 발생하지 않도록 자원 할당 상태를 검사한다

  • 자원 할당 그래프 알고리즘 (Resource Allocation Graph Algorithm)
  • 은행원 알고리즘 (Banker's Algorithm)

'CS > Database' 카테고리의 다른 글

[DB] 4. SQL  (0) 2019.01.21
[DB] 2. 정규화 (Nomalization)  (0) 2019.01.20
[DB] 1. 데이터베이스 (Database)  (0) 2019.01.20