Skip to main content

트랜잭션 ACID와 격리수준

•2 min•322 words

트랜잭션

트랜잭션이란 여러 개의 데이터베이스 작업을 하나의 논리적인 단위로 묶어서 처리하는 것이다.
트랜잭션의 핵심은 작업이 모두 성공하거나, 문제가 생기면 작업 전 상태로 되돌릴 수 있는 것이다.
트랜잭션은 ACID라는 네 가지 특성을 가진다.

ACID

  1. 원자성(Atomicity)
    • 모든 작업이 성공하거나, 모두 실패해야 한다.
  2. 일관성(Consistency)
    • 작업 전후에 데이터의 무결성이 유지되어야 한다.
  3. 격리성(Isolation)
    • 트랜잭션 수행 시에는 다른 트랜잭션이 중간에 끼어들지 않고 독립적으로 실행돼야 한다.
  4. 지속성(Durability)
    • 커밋된 데이터는 장애가 발생해도 보존되어야 한다.

트랜잭션 격리수준

격리 수준(Isolation Level)은 여러 트랜잭션이 동시에 실행될 때 서로의 데이터 변경을 어느 정도까지 허용할지 결정하는 기준이다.

대표적인 격리 수준은 4가지가 있다.

  1. READ UNCOMMITTED
    • 커밋되지 않은 데이터도 읽을 수 있다. (Dirty Read)
    • 사실상 격리를 하지 않고 그냥 냅둔 것이다.
    • 정합성에 문제가 많기 때문에 거의 사용되지 않는다.
  2. READ COMMITTED
    • 커밋된 데이터만 읽을 수 있다.
    • PostgreSQL과 Oracle 의 기본 격리 수준이다.
    • 하지만 어떤 트랜잭션이 실행되는 중간에 누가 커밋을 하면 같은 데이터를 조회해도 다른 값이 조회되는 문제가 생긴다. (Non-Repeatable Read)
  3. REPEATABLE READ
    • 같은 트랜잭션에서 같은 데이터를 여러 번 조회해도 읽은 데이터가 일관되게 유지된다. (Non-Repeatable Read 방지)
    • MySQL InnoDB의 기본 격리 수준이다.
    • 하지만 어떤 트랜잭션이 실행되는 중간에 누가 INSERT나 DELETE를 수행하면, 같은 조건으로 다시 조회했을 때 조회 결과에 새로운 행이 나타나거나 사라지는 문제가 생긴다. (Phantom Read)
    • 다만 MySQL InnoDB에서는 MVCC를 이용해 처음 조회했을 때의 데이터 상태를 기준으로 다시 조회하기 때문에, 일반적인 SELECT 에서는 Phantom Read가 발생하지 않는다고 한다.
  4. SERIALIZABLE
    • 가장 높은 수준의 격리수준이다.
    • 여러 트랜잭션이 동시에 실행되더라도 결과가 순차적으로 실행된 것과 같은 효과를 내도록 한다.
    • 동시성이 낮다.
격리 수준Dirty ReadNon-Repeatable ReadPhantom Read
READ UNCOMMITTED발생 가능발생 가능발생 가능
READ COMMITTED방지발생 가능발생 가능
REPEATABLE READ방지방지표준상 발생 가능
SERIALIZABLE방지방지방지