DatabaseTransaction
트랜잭션 격리 수준
동시에 실행되는 트랜잭션 간 데이터 가시성을 제어하는 4가지 격리 수준을 학습합니다.
한눈에 보기
| 격리 수준 | Dirty Read | Non-Repeatable Read | Phantom Read |
|---|---|---|---|
| READ UNCOMMITTED | O | O | O |
| READ COMMITTED | X | O | O |
| REPEATABLE READ | X | X | O |
| SERIALIZABLE | X | X | X |
이상 현상이란?
Dirty Read
다른 트랜잭션이 커밋하지 않은 데이터를 읽습니다. 해당 트랜잭션이 롤백하면, 존재하지 않는 데이터를 읽은 셈이 됩니다.
Non-Repeatable Read
같은 트랜잭션에서 같은 쿼리를 두 번 실행했을 때 결과가 다릅니다. 다른 트랜잭션이 중간에 데이터를 수정하고 커밋했기 때문입니다.
Phantom Read
같은 조건으로 조회했을 때 이전에 없던 행이 나타납니다. 다른 트랜잭션이 새 행을 삽입하고 커밋했기 때문입니다.
격리 수준 상세
READ UNCOMMITTED
가장 낮은 격리 수준입니다. 커밋되지 않은 데이터도 읽을 수 있어 모든 이상 현상이 발생할 수 있습니다.
실무 사용: 거의 사용하지 않습니다.
READ COMMITTED
커밋된 데이터만 읽습니다. Dirty Read는 방지하지만, 같은 쿼리를 반복 실행하면 다른 결과가 나올 수 있습니다.
기본값: PostgreSQL, Oracle, SQL Server
REPEATABLE READ
트랜잭션 시작 시점의 스냅샷을 기준으로 읽습니다. 같은 쿼리는 항상 같은 결과를 반환합니다.
기본값: MySQL InnoDB
SERIALIZABLE
가장 높은 격리 수준입니다. 트랜잭션이 순차적으로 실행되는 것처럼 동작합니다. 모든 이상 현상을 방지하지만 동시성이 크게 떨어집니다.
실무 사용: 금융 거래 등 정확성이 중요한 경우
직접 체험하기
격리 수준과 시나리오를 선택하고 단계별로 실행하세요. 각 이상 현상이 어떻게 발생하는지 확인할 수 있습니다.
Transaction Isolation Lab
현재 DB 상태
accounts 테이블
| name | balance |
|---|---|
| Alice | 1000 |
| Bob | 500 |
Transaction AIDLE
BEGINSELECTSELECTCOMMITTransaction BIDLE
BEGINUPDATEROLLBACK0 / 7
Transaction A 시작
격리 수준별 이상 현상
| 격리 수준 | Dirty Read | Non-Repeatable | Phantom |
|---|---|---|---|
| READ_UNCOMMITTED | O | O | O |
| READ_COMMITTED | X | O | O |
| REPEATABLE_READ | X | X | O |
| SERIALIZABLE | X | X | X |