Transaction

정미·2022년 7월 13일
0

Computer Science

목록 보기
34/81

Transaction

정의

  • 데이터베이스 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위
  • 한꺼번에 모두 수행되어야 할 일련의 연산들

특징

  • 데이터베이스 시스템에서 병행 제어 및 회복 작업 시 처리되는 논리적 작업 단위
  • 사용자가 시스템에 대한 서비스 요구 시 시스템이 응답하기 위한 상태 변환 과정의 작업 단위
  • 하나의 트랜잭션은 Commit 되거나 Rollback 된다.

4가지 성질 - ACID

Atomicity 원자성

트랜잭션의 연산은 데이터베이스에 모두 반영(commit)되거나 어느 하나라도 오류가 발생하면 전혀 반영되지 않아야 한다(rollback).

Consistency 일관성

시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 후의 상태가 같아야 한다.

트랜잭션이 진행되는 동안 데이터베이스가 변경되더라도 처음 진행을 위해 참조한 데이터베이스로 마저 진행된다.

Isolation 독립성, 격리성

수행 중인 트랜잭션은 완전히 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조할 수 없다.

Durability 영속성, 지속성

성공적으로 커밋된 트랜잭션의 결과는 DB 시스템에 문제가 생겨도 영구적으로 반영되어야 한다.

연산 및 상태

연산

  • Commit
    하나의 논리적 단위에 대한 작업이 성공적으로 끝났고, 데이터베이스가 다시 일관된 상태로 있을 때 해당 트랜잭션 연산이 완료되었다는 것을 트랜잭션 관리자에게 알려주는 연산

  • Rollback
    하나의 트랜잭션 처리가 비정상적을 종료되어 데이터베이스의 일관성을 깨뜨렸을 때, 트랜잭션의 일부가 정상적으로 처리되었더라도 원자성을 구현하기 위해 해당 트랜잭션이 행한 모든 연산을 취소(Undo)하는 연산
    롤백된 트랜잭션은 재시작하거나 폐기한다

상태

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

격리 수준 Isolation Level

동시에 여러 트랜잭션이 처리될 때, 트랜잭션끼리 서로 얼마나 고립되어있는가

  • 특정 트랜잭션이 다른 트랜잭션이 변경한 데이터를 볼 수 있도록 허용할 것인가
  • 격리수준의 레벨이 높아질수록 트랜잭션간 고립 정도가 높아지며 성능이 떨어진다.
  • 동시성을 증가시키면 데이터 무결성에 문제가 발생하고, 데이터 무결성을 유지하면 동시성이 떨어지게 된다.
    • 무조건 Lock으로 수많은 트랜잭션들이 순서대로 처리하게 하면 DB의 성능은 떨어진다.
    • 그렇다고 Lock의 범위를 줄이면 잘못된 값이 들어갈 수도 있다.

Lock

동시성을 제어하여 트랜잭션 처리의 순차성을 보장하기 위한 방법

Shared Lock 공유 락

  • 데이터를 읽을 때 사용되는 락
  • 공유락은 공유락끼리만 동시에 리소스 접근 가능

Exclusive Lock 배타 락

  • 데이터를 변경하고자 할 때 사용
  • 트랜잭션이 완료될 때까지 유지된다
  • 배타락이 해제될 때까지 다른 트랜잭션(읽기 포함)은 해당 리소스에 접근 불가

Level 0: Read Uncommitted

  • SELECT문이 수행되는 동안 해당 데이터에 Shared Lock이 걸리지 않는 계층
  • 트랜잭션이 처리 중이거나, 아직 commit되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다.
  • 데이터베이스의 일관성을 유지하는 것이 불가능하다. (데이터 정합성 문제)
  • Dirty Read 발생
    • A 트랜잭션에서 x=10 → 20으로 변경 (commit 전)
    • B 트랜잭션에서 x 값을 읽음 (x=20)
    • A 트랜잭션 rollback (x=20→10)
    • B 트랜잭션이 잘못된 x 값을 가지고 마저 연산 수행

Level 1: Read Committed

  • SELECT문이 수행되는 동안 해당 데이터에 Shared Lock이 걸리는 계층
  • Oracle, SQL Server에서 기본으로 사용하는 격리 수준
  • 트랜잭션이 수행되는 동안 다른 트랜잭션은 접근하지 못하고 대기한다.
  • Commit된 트랜잭션만 조회 가능하다.
  • Non-Repeatable Read 발생
    • x=10
    • B 트랜잭션에서 x 값을 읽음 (x=10)
    • A 트랜잭션에서 x 값을 10 → 20 으로 변경 후 commit
    • B 트랜잭션에서 다시 x 값을 읽음 (x=20)
  • 작업이 금전적인 처리와 연결되어 있다면 문제가 발생할 수 있다.

Level 2: Repeatable Read

  • MySQL에서 기본으로 사용하는 격리 수준
  • 트랜잭션 범위 내에서 조회한 데이터 내용이 항상 동일함을 보장한다.
  • 다른 사용자는 트랜잭션에 해당되는 데이터 수정이 불가능하다.
  • 내 트랜잭션 번호보다 낮은 트랜잭션 번호에서 커밋된 내용만 볼 수 있다.
    • undo 영역에 백업된 모든 레코드는 변경을 발생시킨 트랜잭션 번호를 포함하고 있다.
  • Non-Repeatable Read 발생 X
    • x=10
    • B 트랜잭션(#1)에서 x 값을 읽음 (x=10)
    • A 트랜잭션(#2)에서 x 값을 10 → 20 으로 변경 후 commit
    • B 트랜잭션(#1)에서 다시 x 값을 읽음. undo 영역에 백업된 데이터 반환. (x=10)
  • Update 부정합, Phantom Read 발생

Level 3: Serializable

  • 가장 단순하고 엄격한 격리 수준
  • 읽기 작업에도 Shared Lock을 설정하고, 동시에 다른 트랜잭션이 해당 레코드를 변경하지 못한다.
  • 동시처리 능력이 다른 격리수준보다 떨어지고 성능 저하가 발생한다.

출처

0개의 댓글