220408_트랜잭션(Transaction) - 정의, 조건, 과정

창고·2022년 7월 20일
0

티스토리에 저장했던 글을 옮겼습니다.
https://mrcocoball.tistory.com/43?category=1080971

1. 트랜잭션(Transaction)의 정의

(1) 정의

  • "쪼갤 수 없는 업무 처리의 최소 단위"를 의미
  • 은행을 예로 들면 A가 B에게 돈을 지급하고 B가 돈을 받을 경우
    이 거래 기록은 하나의 트랜잭션을 구성
    • A가 B에게 돈을 지급했는데 B가 돈을 받지 못했다면 거래가 성립되지 않기 때문에
      이 둘을 별개로 분리할 수 없음
  • 데이터베이스 시스템에서 병행 제어 및 회복 작업 시 처리되는 작업의 논리적인 단위
  • 사용자가 시스템에 대한 서비스 요구 시 시스템이 응답하기 위한 상태 변환 과정의 작업 단위
  • 트랜잭션 처리가 정상적으로 완료된 경우 커밋(commit) 
    오류가 발생할 경우 원래 상태대로 롤백(rollback) 진행
  • 영어로 간단히 Tx로 표기
  • TPS (Transaction Per Second) : 1초 당 처리할 수 있는 트랜잭션의 개수

(2) 목적

  • 데이터 부정합을 방지하고자 할 때 사용
    (데이터베이스 서버에 다중 / 동시 엑세스할 경우나 갱신 처리 과정에서 중단되는 경우 등)
  • 데이터베이스 기능 중 트랜잭션을 조작하는 기능은 데이터베이스 완전성 유지를 확신하게 함
  • 단일 트랜잭션은 데이터베이스 내에 읽거나 쓰는 여러개 쿼리를 요구
  • 트랜잭션은 서로 간섭하지 않아야 함
  • 쿼리 하나가 실패한 경우 데이터베이스 시스템은 전체 트랜잭션 혹은 실패한 쿼리를 롤백

(3) 특징

  • 트랜잭션의 대표적인 이점 중 하나는 무정지성의 향상
  • 운영체제 장애 등의 서버 장애가 발생, 그로부터 데이터베이스를 재가동한 때에 
    '장애 직전까지의 커밋 결과'를 손실하지 않고 마치는 것이 가능
  • 트랜잭션 대응의 데이터베이스에서는 REDO 로그(데이터베이스에서 수행한 작업을 다시 실행하는 로그)를 이용하여 무정지성을 보장
  • REDO 로그 : 데이터 파일에 커밋을 할 때마다 기록을 하는 것이 아니라 캐시 영역에 보관해두고 
    정기적으로 디스크에 기록하는 동작을 취하는데 REDO 로그 파일은 최신 커밋 정보를 가지고 있음 (본체는 비교적 오래된 데이터)
  • 서버 장애 등으로 데이터베이스를 재기동해야 할 경우 REDO 로그의 내용을 데이터 파일에 적용시켜 나감으로서 충돌을 복구함(Clash Recovery)

2. 트랜잭션의 조건 - ACID

(1) 개요

  • 데이터베이스의 트랜잭션은 사용자가 시스템에 대한 서비스 요구 시 
    시스템이 응답하기 위한 상태 변환 과정의 작업 단위
  • 트랜잭션이 안전하게 수행되기 위해서는 ACID 조건을 충족해야 함

(2) 원자성 (Atomicity)

  • 하나의 트랜잭션이 더 이상 작게 쪼갤 수 없는 최소한의 업무 단위어야 한다는 것
  • 트랜잭션이 데이터베이스에 모두 반영되던지 아니면 전혀 반영되지 않아야 함 (All or Nothing)
    • 즉 작업 단위를 일부분만 실행하지 않아야 함
  • 트랜잭션 실행 도중 문제가 발생했을 때 중단된 상태가 아닌 모두 실패 또는 모두 완성되거나 해야 함
    • 예시 : 트랜잭션 100개 명령어 중 99개 완료, 1개 실패 시 무조건 실패로 간주
  • 트랜잭션이 중간에 끊기게 되면 어디서부터 이어서 수행되어야 하는지 모르기 때문에 이를 방지하고자 원자성을 지니게 됨
  • 원자성의 보장
    • 수행하고 있는 트랜잭션에 의해 변경된 내역을 유지,
      이전에 커밋된 상태를 임시 영역에 따로 저장
      하여 원자성을 보장
    • 현재 수행 중인 트랜잭션에서 오류 발생 시 현재 내역을 삭제, 임시 영역에 저장했던 상태로 롤백
    • 롤백 세그먼트(rollback segment)
      이전 데이터들이 임시로 저장되는 영역
    • 세이브 포인트(save point)
      확실한 부분에 대해서는 롤백이 되지 않도록  지정하는 중간 저장 지점
      (트랜잭션의 길이가 길어지게 될 경우 롤백 과정 역시 길어지기 때문에 도입)

(3) 일관성 (Consistency)

  • 트랜잭션이 완료된 결과값이 일관적인 DB 상태를 유지하는 것
  • 시스템이 가지고 있는 고정 요소는 수행 전과 후의 상태가 같아야 하며, 
    트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다는 것
  • 트랜잭션이 진행되는 동안 데이터베이스가 변경되더라도 업데이트된 데이터베이스로 
    트랜잭션이 진행된 것이 아닌, 트랜잭션을 진행하기 위해 참조한 데이터베이스로 진행
  • 트랜잭션 수행이 보존해야 할 일관성은 기본 키, 외래 키 제약과 같은 
    명시적 무결성 제약 조건 뿐만이 아닌 비명시적인 일관성 조건도 포함됨
    • (예시 : A에서 B 계좌로 돈을 송금하는 트랜잭션이라면
      송금 전과 송금 후의 A, B 계좌의 총액이 같아야 한다)
  • 일관성의 보장
    • 트랜잭션 수행 전/후에 데이터 모델의 모든 제약 조건(무결성 제약 조건)을 만족하는 것으로 보장
    • Movie, Video 테이블이 있을 때 Video 테이블의 PK가 외래 키로 존재한다면 Movie 테이블의 제약 조건이 바뀌면 Video 테이블에서도 PK가 변경되어야 함
    • 어떤 이벤트와 조건이 발생했을 때, 트리거(Trigger)를 통해 보장
    • 트리거 (Trigger)
      데이터베이스 시스템이 자동적으로 수행할 동작을 명시할 때 사용, 어떤 행위의 시작을 알리는 것

(4) 고립성 (Isolation)

  • 하나의 트랜잭션 수행 시 다른 트랜잭션의 작업이 끼어들지 못하도록 보장하는 것
  • 트랜잭션끼리는 서로를 간섭할 수 없으며, 트랜잭션이 실행되는 도중에 변경한 데이터는 트랜잭션이 완료될 때까지 다른 트랜잭션이 참조하지 못하게 함
  • 데이터베이스는 클라이언트들이 같은 데이터를 공유하는 것이 목적이므로 여러 트랜잭션이 동시에 수행되어야 함
  • 이 때 트랜잭션은 상호 간의 존재를 모르고 독립적으로 수행되어야 하며, 다른 트랜잭션의 수행에 영향을 받지 말아야 함
  • DBMS의 병행 제어 모듈이 트랜잭션의 고립성을 보장함
  • 고립성의 보장
    • 공유 록(shared_lock)
      트랜잭션에서 데이터를 읽을 때, 여러 트랜잭션이 읽을 수는 있도록 허용 (읽기 전용)
    • 배타 록(exclusive_lock)
      데이터를 쓸 때는 다른 트랜잭션이 읽을 수도 쓸 수도 없도록 함
    • 읽기 쓰기 작업이 끝나면 unlock을 통해 다른 트랜잭션이 lock을 할 수 있도록 데이터에 대한 잠금을 해제
    • 단, lock과 unlock을 잘못 사용하면 데드락(deadlock) 상태가 되어 모든 트랜잭션이 아무 것도 수행할 수 없는 상태가 될 수 있음

(5) 지속성 (Durability)

  • 트랜잭션의 성공 결과 값은 장애 발생 후에도 변함없이 보관되어야 한다는 것
  • 트랜잭션이 정상적으로 완료된 경우에는 버퍼의 내용을 하드디스크(데이터베이스)에 확실히 기록해야 함
  • 부분 완료(Partial Commit) 된 경우에는 작업을 취소 (Aborted) 하여야 함
  • 영속성이라고도 표현하기도 함

3. 트랜잭션의 과정

(1) 개요

  • 작업의 안전성을 확보하기 위해서 데이터베이스는 처리 과정이 모두 성공했을 때만
    최종적으로 데이터베이스에 결과값을 반영
  • 트랜잭션이 중단되거나 서버/하드웨어 고장 등으로 작업에 오류가 생길 시 
    트랜잭션 작업 전으로 돌아가게 됨

(2) 상태

  • 활동 (Active) : 트랜잭션이 실행 중인 상태
  • 실패 (Failed) : 트랜잭션 실행에 오류가 발생하여 중단된 상태
  • 철회 (Aborted) : 트랜잭션이 비정상적으로 종료되어 롤백 연산을 수행한 상태
  • 부분 완료 (Partial Committed) : 트랜잭션의 마지막 연산까지 실행했으나 커밋 연산이 실행되기 직전의 상태
  • 완료 (Committed) : 트랜잭션이 성공적으로 종료되어 커밋 연산을 실행한 후의 상태

(3) 연산

  • 사용자가 적은 쿼리문과 데이터를 최종적으로 데이터베이스에 반영하는 커밋(commit)과 실패했을 시 시점으로 돌아가는 롤백(rollback)이 있음
  • 커밋 (commit)
    • 모든 작업들을 정상적으로 처리하겠다고 확정하는 명령어이며
      처리과정을 데이터베이스에 영구적으로 저장
      하는 것
    • 커밋 수행 시 하나의 트랜잭션 과정을 완전히 종료하는 것
    • 커밋 수행 시 이전 데이터가 완전히 업데이트 됨
    • UPDATE 문으로 데이터를 갱신한 후 DELETE 문으로 기존 데이터를 삭제한 후
      INSERT 문으로 데이터를 삽입
    • 상기 과정이 오류 없이 진행되었을 경우 모든 작업을 데이터베이스에 영구 저장하라는 명령으로 커밋을 수행
  • 롤백 (rollback)
    • 작업 중 문제가 발생하여 트랜잭션의 처리과정에서 발생한 변경 사항을 취소하는 명령어
    • 트랜잭션의 일부가 정상적으로 처리되더라도 트랜잭션의 원자성을 구현하기 위해 트랜잭션이 행한 모든 연산을 취소하는 특성이 있음
    • 트랜잭션이 시작되기 이전의 상태, 즉 마지막 커밋을 완료한 시점으로 돌아가며 커밋하여 저장한 것만 복구
    • 롤백 시에는 해당 트랜잭션을 재시작하거나 폐기함
  • 세이브 포인트 (save point)
    • '임시저장' '부분저장'과 비슷한 맥락. 전체가 아닌 특정 부분에서 트랜잭션을 취소하기 위해 사용
    • 현재의 트랜잭션을 잘게 분할하는 것이 가능
    • 여러 개의 SQL 문의 실행을 수행하는 트랜잭션의 경우 사용자가 트랜잭션 중간 단계에서 세이브 포인트를 지정할 수 있음
    • 취소하려는 지점을 명시한 뒤 그 지점까지 작업을 취소하는 식으로 사용, 처리한 작업이 롤백됨

레퍼런스

http://wiki.hash.kr/index.php/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98

profile
공부했던 내용들을 모아둔 창고입니다.

0개의 댓글