전체 목록
데이터베이스Hard#209

트랜잭션 격리 수준에 따라 발생할 수 있는 이상 현상을 설명해주세요.

#데이터베이스#Isolation#Transaction#동시성

답변 포인트

읽기 이상 현상과 동시성 비용를 기준으로 정의, 장점, 한계, 예시를 함께 설명해보세요.

정답 및 해설

빠른 요약

격리 수준이 낮으면 Dirty Read, Non-repeatable Read, Phantom Read 같은 이상 현상이 발생할 수 있습니다. 격리 수준을 높이면 정합성은 좋아지지만 동시성 비용이 커질 수 있습니다.

트랜잭션 격리 수준은 동시에 실행되는 트랜잭션들이 서로를 얼마나 강하게 격리할지 정하는 정책입니다. 격리가 약하면 성능과 동시성은 좋아지지만 이상 현상이 나타날 수 있습니다.

대표 이상 현상

Dirty Read

아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 현상입니다. 이후 원래 트랜잭션이 롤백하면 읽은 값은 존재하지 않았던 값이 됩니다.

Non-repeatable Read

한 트랜잭션 안에서 같은 row를 두 번 읽었는데, 중간에 다른 트랜잭션이 수정/커밋해서 값이 달라지는 현상입니다.

Phantom Read

같은 조건으로 범위 조회를 두 번 했는데, 중간에 다른 트랜잭션이 row를 삽입/삭제해 결과 집합이 달라지는 현상입니다.

SQL
-- T1
BEGIN;
SELECT COUNT(*) FROM orders WHERE amount >= 100000; -- 10
-- T2가 조건에 맞는 주문 INSERT 후 COMMIT
SELECT COUNT(*) FROM orders WHERE amount >= 100000; -- 11 가능

격리 수준별 특징

격리 수준Dirty ReadNon-repeatablePhantom특징
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/재시도/제약 조건을 조합한다고 답하면 좋습니다.

관련 질문

같은 카테고리/태그 기준