트랜잭션 격리 수준에 따라 발생할 수 있는 이상 현상을 설명해주세요.
답변 포인트
읽기 이상 현상과 동시성 비용를 기준으로 정의, 장점, 한계, 예시를 함께 설명해보세요.
정답 및 해설
빠른 요약
격리 수준이 낮으면 Dirty Read, Non-repeatable Read, Phantom Read 같은 이상 현상이 발생할 수 있습니다. 격리 수준을 높이면 정합성은 좋아지지만 동시성 비용이 커질 수 있습니다.
트랜잭션 격리 수준은 동시에 실행되는 트랜잭션들이 서로를 얼마나 강하게 격리할지 정하는 정책입니다. 격리가 약하면 성능과 동시성은 좋아지지만 이상 현상이 나타날 수 있습니다.
대표 이상 현상
Dirty Read
아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 현상입니다. 이후 원래 트랜잭션이 롤백하면 읽은 값은 존재하지 않았던 값이 됩니다.
Non-repeatable Read
한 트랜잭션 안에서 같은 row를 두 번 읽었는데, 중간에 다른 트랜잭션이 수정/커밋해서 값이 달라지는 현상입니다.
Phantom Read
같은 조건으로 범위 조회를 두 번 했는데, 중간에 다른 트랜잭션이 row를 삽입/삭제해 결과 집합이 달라지는 현상입니다.
-- T1
BEGIN;
SELECT COUNT(*) FROM orders WHERE amount >= 100000; -- 10
-- T2가 조건에 맞는 주문 INSERT 후 COMMIT
SELECT COUNT(*) FROM orders WHERE amount >= 100000; -- 11 가능격리 수준별 특징
| 격리 수준 | Dirty Read | Non-repeatable | Phantom | 특징 |
|---|---|---|---|---|
| Read Uncommitted | 가능 | 가능 | 가능 | 거의 사용하지 않음 |
| Read Committed | 방지 | 가능 | 가능 | 많은 DB 기본값 |
| Repeatable Read | 방지 | 방지 | DB별 차이 | MySQL InnoDB 기본값 |
| Serializable | 방지 | 방지 | 방지 | 가장 강하지만 비용 큼 |
DB별 차이를 조심해야 합니다
이름이 같아도 구현은 다릅니다. PostgreSQL의 Repeatable Read는 snapshot isolation에 가깝고 phantom을 상당 부분 막지만, MySQL InnoDB는 next-key lock과 MVCC 조합으로 동작합니다. 따라서 면접이나 실무에서는 사용 DB 기준으로 확인하는 태도가 중요합니다.
실무 판단
- 단순 조회 API는 Read Committed로 충분한 경우가 많습니다.
- 재고 차감, 쿠폰 발급처럼 경쟁이 있는 작업은 lock, unique constraint, optimistic locking을 함께 고려합니다.
- Serializable은 정확성이 매우 중요할 때 쓰되 재시도 로직을 준비해야 합니다.
면접 답변 포인트
격리 수준은 동시성과 정합성의 균형입니다. 각 수준이 어떤 이상 현상을 허용하는지 설명하고, 실제로는 DB 구현 차이와 비즈니스 요구에 맞춰 lock/재시도/제약 조건을 조합한다고 답하면 좋습니다.