Database - 트랜잭션

Bomin Seo·2022년 7월 26일
0

동시성 제어 (Concurrency control)

  • 항공기 예약, 은행, 신용 카드 처리 등에서는 많은 사용자들이 동시에 데이터베이스의 서로 다른 부분 또는 동일한 부분을 접근하면서 데이터 베이스를 사용한다 : 동시성
  • 동시에 수행되는 트랜잭션들이 데이터 베이스에 미치는 영향은 이들을 순차적으로 수행하였을 때 데이터 베이스에 미치는 영향과 같도록 보장해야 한다.
  • 다수 사용자가 데이터 베이스를 동시에 접근하도록 허용하면서 일관성을 유지한다.
  • DBMS의 성능을 높이기 위해 동시에 수행하는 것이 필수적이며, 동시에 수행하는 환경에서 부정확한 결과를 생성할 수 있는 트랜잭션 간의 간섭이 생기지 않도록 해야 한다.

회복 (Recovery)

  • 데이터베이스를 갱신하는 도중에 시스템이 고장나도 일관성을 유지한다.

트랜잭션

  • 데이터 베이스 응용에서 하나의 논리적인 단위를 수행하는 데이터베이스 연산들의 모임
  • 데이터 객체(투플, 릴레이션)들을 접근하고 갱신하는 프로그램 수행 단위
  • 데이터 전체에 대해 수정할 때는 전원의 데이터가 수정되거나 하나의 데이터도 수정되지 않도록 DBMS에서 보장해야 한다
  • 서로 연관된 질의는 실행 도중 데이터베이스가 가동이 멈추면 안된다 >> 트랜잭션 단위
  • SQL에서는 기본적으로 각각의 SQL문을 하나의 트랜잭션으로 취급하며 2개 이상의 SQL문을 하나의 트랜잭션으로 취급하려면 사용자가 명시적으로 표시해야 한다.

로그

  • DBMS가 고장난 후 재가동된 후에는 이전의 작업 정보를 알기 위해서 로그(Log)를 유지

  • Commit이 예약 완료 메시지 보다 먼저 나온다.

    • Commit이 뒤에 나온다면 DBMS가 고장 후 재가동할 때 오류를 발생시킬 수 있기 때문에

트랜잭션의 특성 (ACID 특성)

원자성(Atomicity) : All or nothing

  • 한 트랜잭션 내의 모든 연산들이 완전히 수행되거나 전혀 수행되지 않음을 의미한다.
  • DBMS의 회복 모듈은 시스템이 다운되는 경우 부분적으로 데이터 베이스를 갱신한 트랜잭션의 영향을 취소함으로써 트랜잭션의 원자성을 보장한다
  • 완료된 트랜잭션이 갱신한 사항은 트랜잭션의 영향을 재수행함으로써 트랜잭션의 원자성을 보장한다.

일관성(Consistency)

  • 어떤 트랜잭션이 수행되기 전에 데이터베이스가 일관된 상태를 가졌다면 트랜잭션이 수행된 후에 데이터베이스는 또 다른 일관된 상태를 가진다.
  • 트랜잭션이 수행되는 도중에는 일시적으로 일관된 상태를 가지지 않을 수 있다.

고립성(Isolation)

  • 한 트랜잭션이 데이터를 갱신하는 동안 이 트랜잭션이 완료되기 전에는 갱신 중인 데이터를 다른 트랜잭션이 접근하지 못하도록 해야 한다.
  • 다수의 트랜잭션들이 동시에 수행되더라도 결과는 어떤 순서에 따라 트랜잭션들을 하나씩 차례대로 수행한 결과와 같아야 한다.
  • DBMS의 동시성 제어 모듈이 고립성을 보장한다.
  • DBMS는 응용들의 요구사항에 따라 다양한 고립 수준을 제공한다.

지속성(Durability)

  • 트랜잭션이 완료되면 트랜잭션이 갱신한 것은 후에 시스템이 고장나더라도 손실되지 않는다.
  • 완료(commit)된 트랜잭션의 효과는 시스템이 고장난 경우에도 데이터 베이스에 반영된다.
  • DBMS의 회복 모듈은 시스템이 다운되는 경우에도 트랜잭션의 지속성을 보장한다.

트랜잭션의 완료(Commit)

  • 트랜잭션에서 변경하려는 내용이 완전하게 반영된다.
  • SQL 구문상으로 COMMIT WORK

트랜잭션의 철회(abort)

  • 트랜잭션이 변경하려는 내용이 데이터베이스에 일부만 반영된 경우에는 원자성을 보장하기 위해서 트랜잭션이 갱신한 사항을 트랜잭션이 수행되기 전의 상태로 되돌린다.
  • SQL 구문상으로 ROLLBACK WORK

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

  • 시스템(사이트) 고장 : 중앙 처리 장치, 주기억 장치, 전원 공급 장치 등이 고장난 경우
  • 트랜잭션 고장 : 트랜잭션이 수행되는 도중에 철회된 경우
  • 매체 고장 : 디스크 헤드/컨트롤러 등이 고장나서 보조 기억 장치의 전체/일부 내용 지워진 경우
  • 통신 고장
  • 자연적 재해
  • 부주의 또는 고의적인 고장

동시성 제어

스케줄

  • 트랜잭션들을 수행하는 순서

직렬 스케줄(serial schedule)

  • n개의 트랜잭션이 있을 때 : n!
  • 여러 트랜잭션들의 집합을 한 번에 한 트랜잭션씩 차례대로 수행한다.

비직렬 스케줄(Non - serial schedule)

  • (n_1+n_2+⋯+n_n )!/(n_1 !n_2 !…n_n !)
  • 여러 트랜잭션들을 동시에 수행한다.

직렬 가능(serializable)

  • 비직렬 스케줄의 결과가 어떤 직렬 스케줄의 수행 결과와 동등하다.
  • 비직렬 스케줄이 직렬 가능 스케줄일 때 올바른 스케줄이라고 판단한다.
  • Result equivalence : 결과가 같은 값으로 나온다는 것을 의미한다. (우연히 같아질 수 있다)
  • Conflict equivalence : 데이터를 읽고 쓰는 순서가 동일하다는 것을 의미한다. (주로 사용)

데이터 베이스 연산

Input(X)

  • 데이터 베이스 항목 X를 포함하고 있는 블록을 주기억 장치의 버퍼로 읽어들인다.

Output(X)

  • 데이터 베이스 항목 X를 포함하고 있는 블록을 디스크에 기록한다.

Read_item(X)

  • 주기억 장치 버퍼에서 데이터베이스 항목 X의 값을 프로그램 변수 X로 복사한다.

Write_item(X)

  • 프로그램 변수 X의 값을 주기억 장치 내의 데이터 베이스 항목 X에 기록한다.

동시성 제어를 하지 않고, 다수의 트랜잭션을 동시에 수행할 때 생길 수 있는 문제

갱신 손실 (심각성이 크다)

  • 수행 중인 트랜잭션이 갱신한 내용을 다른 트랜잭션이 덮어씀으로써 갱신이 무효가 되는 것

오손 데이터 읽기

  • 완료되지 않은 트랜잭션이 갱신한 데이터를 읽는 것

반복할 수 없는 읽기 (심각성이 작다)

  • 한 트랜잭션이 동일한 데이터를 두 번 읽을 때 서로 다른 값을 읽는 것

Locking

  • 데이터 항목을 로킹하는 개념은 동시에 수행되는 트랜잭션들의 동시성을 제어하기 위해서 가장 널리 사용되는 기법
  • Lock는 데이터베이스 내의 각 데이터 항목과 연관된 하나의 변수
  • 각 트랜잭션이 수행을 시작하여 데이터 항목을 접근할 때마다 요청한 로크에 관한 정보는 로크 테이블 등에 유지한다.
  • 트랜잭션에서 데이터 항목을 접근할 때 로크를 요청하고, 접근을 끝낸 후에 로크를 해제
    - 갱신 목적 접근 : 독점 로크(X-lock, eXclusive lock)를 요청함
    - 판독(읽기) 목적 접근 : 공유 로크(S-LOCK, Shared lock)를 요청함

2단계 로킹 프로토콜

  • 로크를 요청하는 것과 해제하는 것이 2단계로 이루어진다.
  • 로크 확장 단계가 지난 후에 로크 수축 단계에 들어간다.
  • 로크를 한 개라도 해제하면 로크 수축 단계에 들어간다.

로크 확장 단계 (1단계)

  • 로크 확장 단계에서는 트랜잭션이 데이터 항목에 대하여 새로운 로크를 요청할 수 있지만 보유하고 있던 로크를 하나라도 해제할 수 없다

로크 수축 단계 (2단계)

  • 로크 수축 단계에서는 보유하고 있던 로크를 해제할 순 있지만, 새로운 로크 요청 불가
  • 로크를 조금씩 해제할 수도 있고, 트랜잭션 완료 후 한 번에 해제할 수도 있다.
  • 일반적으로 한 번에 해제하는 방식이 사용된다.

로크 포인트

  • 한 트랜잭션에서 필요로 하는 모든 로크를 걸어 놓은 시점

데드록(deadlock)

  • 2단계 로킹 프로토콜에서는 데드록이 발생할 수 있다.
  • 데드록은 두 개 이상의 트랜잭션들이 서로 상대방이 보유하고 있는 로크를 요청하면서 기다리고 있는 상태
  • 데드록을 해결하기 위해서는 데드록을 방지하는 기법이나, 데드록을 탐지하고 희생자(철회 비용이 적은 트랜잭션)를 선정하여 데드록을 푸는 기법 등을 사용한다.
  • 로크 요청 그래프(방향 그래프)에서 사이클이 존재하면 데드록이 존재하는 것

다중 로크 단위(multiple granularity)

  • 소수의 투플을 접근하는 데이터베이스 응용에서는 투플 단위로 로크를 해도 로크 테이블을 다루는 시간이 오래 걸리지 않는다.
  • 트랜잭션들이 많은 투플을 접근하는 데이터베이스 응용에서 투플 단위로만 로크를 한다면 로크 테이블에서 로크 층들을 검사하고, 로크 정보를 기록하는 시간이 오래 걸린다.
  • 트랜잭션이 접근하는 투플의 수에 따라 로크를 하는 데이터 항목의 단위를 구분해야 한다.
  • 한 트랜잭션에서 로크할 수 있는 데이터 항목이 2가지 이상 있으면 다중 로크 단위
  • 로크할 수 있는 단위 : 데이터베이스, 릴레이션, 디스크 블록, 투플 등
  • 일반적으로 DBMS는 각 트랜잭션에서 접근하는 투플 수에 따라 자동적으로 로크 단위 조정
  • 로크 단위가 작을수록 로킹 오버헤드가 증가하며 동시성의 정도도 증가한다.

Intension lock

  • X, S 로크 외에도 IX, IS 로크를 사용함으로써 하위 노드에 로크를 걸 경우 영향을 받는 노드에 IX/IS 로크를 요청하고 로크가 허용되면 해당 노드에 X/S 로크를 건다.

팬텀 문제

  • SELECT문이 실행되고 질의 결과를 받은 후 INSERT로 새로운 데이터가 삽입된 상황에서 다시 SELECT문을 실행하면 첫번째 SELECT문에서 등장하지 않았던 새로운 데이터(팬텀)이 등장하는 문제
profile
KHU, SWCON

0개의 댓글