Transaction 이란?


Transaction 이란 논리적으로 하나의 단위로 묶인 여러 개의 SQL 쿼리 모음이다. 데이터의 정합성을 보장하기 위해 고안된 방법으로, 다른 Transaction 과 독립적이고 일관되고 신뢰할 수 있는 방식으로 처리되어야 한다. 예를 들어 송금 Transaction 같은 경우, SELECT, UPDATE, UPDATE 문이 하나의 논리적인 단위로 실행되어야 하기 때문에 이 3개의 SQL 쿼리를 하나의 Transaction 으로 묶어 처리한다.

Transaction 의 목적

  • 오류로부터 복구를 허용하고 데이터베이스를 일관성 있게 유지하는 안정적인 작업 단위를 제공
  • 동시에 접근하는 여러 프로그램 간에 격리를 제공

Transaction Lifespan

  • Transaction BEGIN
  • Transaction COMMIT
  • Transaction ROLLBACK

ACID


ACID 는 Transaction 의 목적을 달성하기 위해 Transaction 이 가져야 하는 4가지 속성이다.

  • Atomicity
  • Consistency
  • Isolation
  • Durability

Atomicity, 원자성

  • 트랜잭션에 포함된 모든 쿼리가 모두 성공하거나 실패해야 한다.
  • 트랜잭션에 포함된 쿼리 중 하나라도 실패하거나 DB 가 트랜잭션 도중 종료돼도 모두 Rollback 돼야한다.

Consistency, 일관성

  • 트랜잭션을 실행한 전후에는 데이터의 일관성이 손상되지 않아야 한다.
  • 읽기 일관성 역시 보장되어야 하는데, 클러스터로 이루어진 DB 시스템의 경우 Update 직후 Read 가 일관성을 보장하지 않을 수도 있다.

Isolation, 격리성

  • 동시에 실행하는 여러 개의 트랜잭션이 서로 영향을 주지 않아야 한다.
  • 동시에 트랜잭션이 실행될 때 여러 Read Phenomena 가 발생할 수 있다.
    • Dirty Reads
    • Lost Updates
    • Non-repeatable Reads
    • Phantom Reads
  • 다양한 Isolation Level 로 이런 Read Phenomena 들을 해결할 수 있다.
    • Read Uncommitted
    • Read Committed
    • Repeatable Read
    • Snapshot
    • Serializable
  • DBMS 마다 이를 다르게 구현한다.
    • 비관적 락: Row locks, Table locks, Page locks 등을 활용한다.
    • 낙관적 락: Lock 을 사용하지 않고 변경사항을 추적한다.
    • RR 은 대부분 Row lock 을 활용하여 구현하는데, Postgres 의 경우 RR 를 Snapshot 으로 구현해서 Phantom Read 가 발생하지 않는다.
    • MySQL Transaction Isolation Level 에서 MySQL 은 어떻게 구현했는지 알아보자.

Durability, 영속성

  • 커밋이 완료된 트랜잭션은 손상되지 않는 성질을 말한다.
  • Durability 를 보장하기 위한 여러 기술이 존재한다.
    • WAL, Write Ahead Log
      • 모든 데이터를 Disk 에 영속시키는 것은 비싸기 때문에 WAL 로 압축된 변경사항만 저장한다.
    • Asynchronous Snapshot
    • AOF, Append Only File
    • OS Cache

References