트랜잭션 ACID와 격리수준
•2 min read2 min•322 words322 words
트랜잭션
트랜잭션이란 여러 개의 데이터베이스 작업을 하나의 논리적인 단위로 묶어서 처리하는 것이다.
트랜잭션의 핵심은 작업이 모두 성공하거나, 문제가 생기면 작업 전 상태로 되돌릴 수 있는 것이다.
트랜잭션은 ACID라는 네 가지 특성을 가진다.
ACID
- 원자성(Atomicity)
- 모든 작업이 성공하거나, 모두 실패해야 한다.
- 일관성(Consistency)
- 작업 전후에 데이터의 무결성이 유지되어야 한다.
- 격리성(Isolation)
- 트랜잭션 수행 시에는 다른 트랜잭션이 중간에 끼어들지 않고 독립적으로 실행돼야 한다.
- 지속성(Durability)
- 커밋된 데이터는 장애가 발생해도 보존되어야 한다.
트랜잭션 격리수준
격리 수준(Isolation Level)은 여러 트랜잭션이 동시에 실행될 때 서로의 데이터 변경을 어느 정도까지 허용할지 결정하는 기준이다.
대표적인 격리 수준은 4가지가 있다.
- READ UNCOMMITTED
- 커밋되지 않은 데이터도 읽을 수 있다. (Dirty Read)
- 사실상 격리를 하지 않고 그냥 냅둔 것이다.
- 정합성에 문제가 많기 때문에 거의 사용되지 않는다.
- READ COMMITTED
- 커밋된 데이터만 읽을 수 있다.
- PostgreSQL과 Oracle 의 기본 격리 수준이다.
- 하지만 어떤 트랜잭션이 실행되는 중간에 누가 커밋을 하면 같은 데이터를 조회해도 다른 값이 조회되는 문제가 생긴다. (Non-Repeatable Read)
- REPEATABLE READ
- 같은 트랜잭션에서 같은 데이터를 여러 번 조회해도 읽은 데이터가 일관되게 유지된다. (Non-Repeatable Read 방지)
- MySQL InnoDB의 기본 격리 수준이다.
- 하지만 어떤 트랜잭션이 실행되는 중간에 누가 INSERT나 DELETE를 수행하면, 같은 조건으로 다시 조회했을 때 조회 결과에 새로운 행이 나타나거나 사라지는 문제가 생긴다. (Phantom Read)
- 다만 MySQL InnoDB에서는 MVCC를 이용해 처음 조회했을 때의 데이터 상태를 기준으로 다시 조회하기 때문에, 일반적인
SELECT에서는 Phantom Read가 발생하지 않는다고 한다.
- SERIALIZABLE
- 가장 높은 수준의 격리수준이다.
- 여러 트랜잭션이 동시에 실행되더라도 결과가 순차적으로 실행된 것과 같은 효과를 내도록 한다.
- 동시성이 낮다.
| 격리 수준 | Dirty Read | Non-Repeatable Read | Phantom Read |
|---|---|---|---|
| READ UNCOMMITTED | 발생 가능 | 발생 가능 | 발생 가능 |
| READ COMMITTED | 방지 | 발생 가능 | 발생 가능 |
| REPEATABLE READ | 방지 | 방지 | 표준상 발생 가능 |
| SERIALIZABLE | 방지 | 방지 | 방지 |