트랜잭션은 여러 문장을 하나의 원자적 단위로 묶습니다: 모두 커밋되거나 모두 롤백되며, 이것이 ACID의 A, C, I, D입니다. 격리 수준은 이 "I"를 조정합니다 — 동시 트랜잭션이 서로의 커밋되지 않았거나 변경 중인 데이터를 얼마나 볼 수 있는지 말이죠.
트랜잭션은 여러 문장을 하나의 원자적 단위로 묶습니다: 모두 커밋되거나 모두 롤백되며, 이것이 ACID의 A, C, I, D입니다. 격리 수준은 이 "I"를 조정합니다 — 동시 트랜잭션이 서로의 커밋되지 않았거나 변경 중인 데이터를 얼마나 볼 수 있는지 말이죠.
| 수준 | 더티 리드 | 반복 불가능한 읽기 | 팬텀 |
|---|
| READ UNCOMMITTED | 가능 | 가능 | 가능 |
| READ COMMITTED | 없음 | 가능 | 가능 |
| REPEATABLE READ (InnoDB 기본값) | 없음 | 없음 | 대부분 없음* |
| SERIALIZABLE | 없음 | 없음 | 없음 |
*InnoDB의 REPEATABLE READ는 MVCC(각 트랜잭션이 일관된 스냅샷을 읽음)와 **넥스트 키 락(next-key lock)**을 함께 사용하여 대부분의 팬텀도 차단합니다 — SQL 표준이 요구하는 것보다 강력하죠.
SELECT @@transaction_isolation; -- REPEATABLE-READ by default
START TRANSACTION;
SELECT balance FROM accounts WHERE id = 1; -- snapshot taken here
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT; -- both updates apply, or ROLLBACK undoes both
특별한 이유가 없다면 InnoDB 기본값(REPEATABLE READ)을 유지하세요. READ COMMITTED(Postgres/Oracle의 기본값)는 쓰기가 많은 시스템에서 잠금 경합을 줄여줍니다. SERIALIZABLE은 정확하지만 충돌하는 작업을 직렬화하고 데드락이 더 자주 발생할 수 있습니다.
격리는 정확성과 동시성 사이의 조절 다이얼입니다. 이 이상 현상들을 이해하면 "부하 상태에서 합계가 맞지 않는다" 같은 버그를 설명할 수 있고, 처리량을 불필요하게 제한하지 않으면서 돈이 오가는 트랜잭션을 정확하게 유지하는 수준을 선택할 수 있습니다.
주니어부터 시니어까지 상세한 답변이 포함된 IT 면접 질문 라이브러리.
후원하기