트랜젝션

Updated:

강의

http://www.kocw.net/home/search/kemView.do?kemId=317898

트랜젝션

  • 트랜잭션의 개념 및 특성
  • 동시성(병행) 개념
  • 동시성의 문제 및 제어 방법
  • 회복 기법

1. 트랜잭션

  • 분리되어서는 안 되는 기본 단위 작업(논리적 단위 작업)

  • 예) 계좌 A에서 300원을 인출해서 계좌 B로 입금하라.

read(A) 	// 계좌 A의 금액
A = A - 300 // 300원 인출
write(A) 	// 계좌 A 갱신
read(B) 	// 계좌 B 금액
B = B + 300 // 300원 입금
write(B) 	// 계좌 갱신
  • 여기서 A가 인출하는 순간, B에 입금하는 순간 문제가 생긴다면?

1.1 트랜잭션이 성공하지 못하는 원인

  • 시스템 고장 또는 사이트 고장
  • 트랜잭션 고장
  • 매체 또는 기기 고장
  • 통신 고장
  • 자연 재해
  • 부주의 또는 고의적 오류

1.2 트랜잭션의 특성

  • ACID
  • 원자성(Automicity)
    • 전부 실행 또는 전혀 실행하지 않음
    • 일부만 실행할 수 없음
  • 일관성 (Consistency)
    • 실행 결과에 일관성이 있어야 함
    • 데이터베이스에 모순이 발생하지 않아야 함
  • 고립성 (Isolatin)
    • 독립적으로 실행
    • 다른 트랜잭션에 간섭을 주거나 받지 말아야 함
  • 지속성 (Durability)
    • 트랜잭션의 결과는 영속적임
    • 결과는 손실되지 않고 보존되어야 함

1.3 트랜잭션의 상태

  • 활성화 : 트랜잭션의 시작
  • 부분완료 : 마지막 명령문 실행 직전
  • 실패 : 비정상적으로 중단
  • 철회 : 트랜잭션을 실패하여 롤백(rollback)
  • 완료 : 트랜잭션을 성공적으로 수행
  • 결과적으로 철회 아님 완료

1.4 commit 과 rollback

  • commit : 성공적인 종료, 완료
    • 데이터베이스의 내용이 갱신되고, 일관된 상태를 갖음.
  • rollback : 비성공적인 종료, 철회
    • 트랜잭션에 이상이 발생, 실행이 취소되고, 최초 상태로 복귀
    • 중간결과는 취소되어야 함

2. 병행의 개념

  • 병행 또는 동시성

  • 인터러빙(interleaving)이라고도 함 : 일이 중첩이 되지 않음
  • 이와 반대되는 개념이 오버래핑(overlapping) : 일이 중첩됨
  • 예를 들어보자
  • 요리사가 한명인 곳이 있다.
  • 요리사는 라면, 갈비탕, 순두부를 동시에 만든다고 할 때, 동시에 3개를 만드는 것처럼 보인다.
  • 그러나 딱 한 시점을 보면 라면을 끓이다가 같은 시점에 동시에 갈비탕, 순두부를 끓일 수는 없다.
  • 라면을 물 올려놓는 시간 동안 갈비탕, 순두부 모두 물을 올릴 수는 없기 때문이다.
  • 따라서 결과적으로 라면, 갈비탕, 순두부가 시간차이로 요리가 만들어진다.
  • 컴퓨터는 너무 빨라서 동시(같은 시간)에 처리되는 것처럼 보이나 실제는 위의 예처럼 다른 시간에 처리됨.
  • 우리나라가 번역을 거지 같이 했다. 동시= 병행 이렇게 봐야함 여기서는
  • 반대로 요리가 여러명이 있다고 하자.
  • A요리사가 라면을 끓이는 동안 B요리사는 갈비탕을 만든다.
  • 이때는 어느 한시점을 봐도 라면, 갈비 모두 요리가 되고 있다.
  • 이것은 요리가 중첩되어 만들어져 있으므로 시간의 흐름을 보았을 때 동시에 만들어지는 것으로 볼 수 있다.

2.1 병행 프로세스

  • 비동기적 병행 프로세스 (asycronized concurrency process)

  • 즉, 아무때나 불규칙적으로 함께 수행되는 프로세스

  • 요리사가 라면 물 올려놓고, 갈비탕 물 올리고, 순두부 물 올리고, 다시 라면 스프 넣고, 순두부 두부 넣고, 갈비탕 갈비 넣고, 순두부 고추가루 넣고 이렇게 불규칙하게 아무때나 함께 수행됨

2.2 병행처리의 문제점

  • 원인 : 공유데이터(자원) => 갱신 분실, 모순, 연쇄복귀

  • 해결 방안: 상호 배제

  • 충돌 : 같은 연산이 다른 트랜잭션에도 존재하고 동일한 데이터 항목에 접근하며 적어도 하나의 write 연산이 실행될 때, 충돌이 발생한다.

2.3 해결

2.3.1 직렬 스케쥴
  • 순차 처리
  • 처리 정확성
  • 처리에 비효율성
2.3.2 비직렬 스케줄
  • 병행 처리
  • 충돌 가능성
  • 처리에 효율성

2.4 총돌 동등과 충돌 직렬 가능 스케줄

  • 충돌 동등 : 충돌 연산을 포함하지만, 결과는 동일(정상)
  • 충돌 직렬 가능 스케줄 : 충돌 연산을 포함하지만, 직렬화된 스케줄이 가능
  • 그러나 이것은 현실적으로 구현하기 힘듬

2.5 뷰 동등과 뷰 직렬 가능 스케줄

  • 뷰동등

    1) 데이터 요소 x에 대하여 스케쥴 S에서 Ti가 x의 초기값을 읽는다면, 스케쥴 S`에서도 Ti가 초기값을 읽어야 한다.

    2) 스케쥴S에서 Ti가 수행한 모든 read(x)의 연간 값이 Ti가 수생한 write(x)가 생성한 값이라면,

    S`에서 Ti가 수행한 모든 read(x)의 연산값도 Ti가 수행한 write(x)가 생선한 값이어야 한다.

    3) 스케쥴S 에서 Ti가 마지막 write(x)을 실행하였으면, 스캐쥴 S`에서도 Ti가 마지막으로 write(X)을 샐행하여야 한다.

3. 주요 동시성 제어 방법

  • 직렬 스케쥴링

    • 충돌이 없도록 스케쥴을 직렬화
    • 그러나 이것은 만들기 어렵다. 비현실적
    • 그래서 아래 두 가지를 많이 사용한다.
  • Locking

    • 주요 데이터 사용 시, lock and then execute
    • ex) phase locking
  • Timestamp

    • 모든 트랜잭션에서는 시스템 전체를 통해 유일한 timestamp 사용
    • 교착상태(dead lock)가 절대 발생하지 않음

3.1 로킹 기법

  • 로킹
    • 트랜잭션의 병행기법
    • 상호배제 보장
    • 독점 제어 제공
  • 구조
    • lock : lock 걸려있으면 대기 아니면 계속
    • 공유데이터 read, write
    • unlock : lock 해제
  • 로킹 규약의 제약
    • 하나의 트랜잭션이 공유데이터(임계 구역)를 사용할 수 있다.
    • 판독을 목적으로 하는 경우에는, 동시 접근해도 문제가 없다.
3.1.1 2단계 로킹 규약
  • 확장 단계
    • 새로운 lock 연산만을 실행할 수 있고 unlock 연산을 수행할 수 없는 단계
  • 축소 단계
    • unlock 연산을 실행할 수 있고, unlock 연산이 실행되면 lock 연산을 실행할 수 없는 단계
  • 2단계 로킹 규약(2PLP)
    • 어느 스케쥴에 참여하고 있는 모든 트랜잭션이 2단계 로킹 규약을 준수하였다면 이 스케쥴은 직렬 가능하다.
    • 한 트랜잭션에서 모든 lock연산들이 첫 번째 unlock 연산 이전에 실행되었다면, 이 트랜잭션을 2PLP를 준수하였다고 할 수 있다.

  • 위의 예제를 보자
  • T1, T2 스케쥴이 있다. 이것은 병행으로 T1, T2이 실행되고 있다.
  • T1이 먼저 x를 lock하고 unlock을 했다. 그리고 y를 lock했다.
  • T2가 그 다음 실행되는 x를 lock했다. T1에서 x를 unlock했기 때문에 가능하다. 그리고 x에 대해서 연산을 수행한다.
  • 이와 병행으로 T1은 y를 수행하다가 y를 unlock했다.
  • T2는 x연산을 하면서 y를 lock한다. 그리고 x 연산이 끝나서 unlock하고 y에 대해서 마무리 연산 후 unlock 한다.
  • 이것은 병행으로 실행되었지만 위에서 얘기한 것 처럼 한 트랜잭션이 어떤 연산을 하려고 할때 다른 트랙잰션에서 unlock만 되어 있다면 수행이 가능하므로 2PLP를 준수했다고 본다.
  • 2PLP를 준수했다면 결국 병행처럼 보이는 스케쥴도 직렬이 가능하다라고 볼 수 있다.

  • 위의 예제는 그 전과 똑같이 병행처리고 lock 처리는 맞다. 그러나 2PLP가 아니다.
  • 예를 들어 T2에서 lock(y)가 unlock(x) 뒤에 있기 때문이다.
  • 즉, 첫 번재 unlock이전에 모든 lock이 먼저 일어나야 한다.

3.2 Timestamp

  • 타임 스탬프 순서 기법
    • 비직렬 트랜잭션을 타임 스탬프 순서에 의해 트랜잭션 직렬화
    • 로깅이 필요 없으므로 교착상태가 발생하지 않음
    • 로킹과 교착상태 탐지 비죵을 줄일 수 있음
    • 분산데이터베이스에서 활용 가능
  • 타임 스탬프 순서
    • 트랜잭션을 유일하게 식별하는 식별자
    • 트랜잭션 시작 시간으로 간주 가능
    • 종류
      • 논리적 계수 : 계수기를 사용해서 트랜잭션이 들어 올 때마다 증가
      • 시스템 클록 : 시스템의 고유 시간
3.2.1 타임 스탬프 순서 규칙
  • 트랜잭션 Ti가 read(x)를 수행하려고 할 때,
    • TS(Ti) < write_TS(x) 이면, read(x)를 거부하고, Ti 취소 + 복귀
    • TS(Ti) >= writ_TS(x) 이면, read(x)를 허용하고, read_TS(Ti)과 read_TS(x) 중 큰 것으로 선택
  • 트랜잭션 Ti write(x)를 수행하려고 할 때,
    • TS(Ti) < read_TS(x)이면, write(x)을 거부하고 Ti 취소+복귀
    • TS(Ti) < write_TS(x)이면, write(x)을 거부하고 Ti 취소+복귀
    • 그 외의 경우에는, write_TS(x)를 허용하고 write_TS(x) 값을 TS(Ti)로 고정

4. 회복 기법

  • 트랜잭션이 실행되는 동안 재해나 실수에 의한 장애로부터 가장 가까운 정상 상태로 복귀하는 것

4.1 주요 회복기법

  • 로그 기법
    • 지연 갱신 기법
    • 즉기 갱신 기법
  • 검사점 기반
  • 그림자 페이지 사용
  • 2 phase commit
4.1.1 로그 기반 기법

4.1.2 검사점 기반

  • t1, t2, t3 : 회복 대상에서 제외
  • t4, t5, t6 : 일단 undo 하고, t4는 c2 이후 부분 redo, t5, t6는 redo
4.1.3 그림자 페이지 사용

  • 현재 테이블은 주기억 장치에 저장, 그림자 페이지 테이블을 디스크에 저장
  • 트랜잭션 시작 시점에서 그림자 테이블 저장
4.1.4 2 phase commit (2PC)

  • 조정자 : 분산 트랜잭션 참여자 명단 보유
  • 참여자 : 트랜잭션 수행

  • 2PC는 직렬성을 보장하는 통신 규약
  • 각 트랜잭션은 lock과 unlock을 2단계로 발신함
  • 신뢰도가 증가하지만, 오버헤드 증가