227. 트랜잭션 고립화 수준 (Isolation Level) - ANSI ISO SQL 표준 4단계 동시성 제어 격리성 성능 트레이드오프 Dirty Read Phantom Read 오라클 MySQL
핵심 인사이트: (202번의 5대 에러를 통제하는 4단계 안전벨트) 202번에서 격리성(Isolation)이 박살 나면 더티 리드(오손 읽기), 모순성, 팬텀 리드(유령) 같은 생지옥이 터진다고 했다. 근데 이 지옥들을 막으려고 216번처럼 2단계 락킹(2PL)으로 무쇠 자물쇠를 칭칭 감아버리면, 동시성(성능)이 개박살 나서 손님들이 화병으로 죽는다. "야 ㅆㅂ!! 무조건 100% 철통 방어(자물쇠)만 고집하지 마!! 은행 서버면 속도가 좀 느려도 철통 방어(Level 3)를 쳐서 귀신도 못 들어오게 막는 게 맞지! 하지만 단순한 네이버 뉴스 기사 조회수 올리는 쿼리면, 중간에 쓰레기 데이터 좀 섞여 들어가서 조회수가 10 올라가야 할 게 11 올라가도 아무도 안 죽잖아!! 그런 사소한 데는 자물쇠 다 풀어버리고 속도를 로켓처럼 올려버려(Level 0)!! DB 엔진에게 상황에 맞춰 자물쇠를 조이고 풀 수 있는 4단계짜리 강도 다이얼(고립화 수준)을 달아줘라!!" 완벽한 무결성과 미친 속도 사이의 트레이드오프를 조율하는 4단 변속기, 고립화 수준이다.
Ⅰ. 격리성(Isolation)의 저주스러운 양면성
- 트랜잭션의 4대 원칙(ACID) 중 **격리성(I)**은 "내 트랜잭션 도중에 남이 끼어들지 못하게 완벽한 밀실을 만들어라"라는 뜻입니다.
- 밀실을 완벽하게 만들수록(고립화 수준 증가) ➜ 202번 5대 모순 에러는 소멸하지만 ➜ 대기 시간(블로킹)이 길어져 속도(동시성)는 최악으로 박살 납니다.
- 그래서 국제 표준화 기구(ANSI/ISO)는 "개발자가 비즈니스 중요도에 따라 방패의 두께를 4단계로 골라서 쓸 수 있게 표준을 정하자!"라며 고립화 수준(Isolation Level) 4단계를 법으로 제정했습니다.
Ⅱ. 고립화 수준 4단계 완전 정복 🌟 무조건 암기 🌟
아래로 내려갈수록 방패가 두꺼워져 에러는 막아내지만 속도는 거북이가 됩니다. (228~231번에서 딥하게 파고듦)
Level 0: Read Uncommitted (커밋 안 된 것도 읽어라!)
- 특징: 방어막 두께 0cm. 락(Lock)을 아예 안 씁니다. 남이 엑셀 칸을 고치고 아직
COMMIT(확정) 도장도 안 찍었는데 그 덜 익은 쓰레기 피투성이 데이터(Uncommitted Data)를 마구잡이로 읽어갑니다. - 방어하는 에러: 아무것도 못 막습니다. 오손 읽기(Dirty Read) 대참사가 100% 터집니다.
- 속도: 우주 최강 (동시성 최고). 은행에선 쓰면 감옥 가고, 통계나 단순 조회용으로만 씁니다.
Level 1: Read Committed (커밋된 것만 읽어라!) 🌟 오라클의 기본값 🌟
- 특징: 방어막 두께 3cm. "야! 최소한 남이
COMMIT도장 쾅 찍어서 완벽하게 구워진 데이터만 읽어!" - 방어하는 에러: 이 룰 덕분에 덜 익은 데이터를 먹고 배탈이 나는 오손 읽기(Dirty Read)를 우주에서 완벽히 소멸시킵니다.
- 못 막는 에러: 하지만, 내가 엑셀을 두 번 읽는 사이에 남이 들어와서 값을 고치고
COMMIT튀어버리면, 나는 헛것을 보게 되는 모순성(Non-Repeatable Read)은 여전히 방어하지 못하고 털립니다. - 전 세계 가장 많은 DB(오라클, SQL Server)가 쓰는 현실적인 가성비 타협점입니다.
Level 2: Repeatable Read (내가 읽은 건 무조건 락 걸어!) 🌟 MySQL의 기본값 🌟
- 특징: 방어막 두께 7cm. 내가 데이터를 한 번 딱 읽으면(Read), 내 트랜잭션이 끝날 때까지 그 데이터에 쇠사슬(Shared Lock)을 꽁꽁 감아버려 남들이 절대로 값을 못 고치게(UPDATE 금지) 막아버립니다.
- 방어하는 에러: 내가 읽고 있는 동안 남이 못 고치니, 두 번 세 번 백 번을 다시 읽어도 값이 영원히 똑같습니다. 즉, 모순성(Non-Repeatable Read)을 완벽히 방어해 냅니다!
- 못 막는 에러: 기존 놈(UPDATE)은 막았지만, 도둑이 아예 텅 빈 허공의 빈 공간에 새로운 데이터를 쓱 찔러넣고 튀는 것(INSERT)은 못 막습니다. 그래서 개수가 3개에서 4개로 늘어나는 유령 읽기(Phantom Read)는 여전히 방어하지 못하고 털립니다.
Level 3: Serializable (전부 다 일렬로 줄 서!)
- 특징: 방어막 두께 100cm (티타늄 벙커). 엑셀 테이블 전체 입구에 거대한 바리케이드(Table Lock / Range Lock)를 쳐버립니다.
- 방어하는 에러: UPDATE든 INSERT든 나 외에는 아무도 방에 못 들어옵니다. 유령 읽기(Phantom Read)를 포함해 인간 세상의 모든 데이터 붕괴 에러를 100% 완벽하게 원천 차단합니다.
- 속도: 최악 중의 최악. 모두가 1명씩 줄 서서 기다려야 하므로 동시성이 바닥을 칩니다. 생명이 걸린 돈 계산에만 잠깐 쓰고 버려야 합니다.
Ⅲ. 시험을 씹어먹는 십자 테이블 🌟 절대 진리 🌟
이 표를 그릴 줄 알면 정보처리기사 DB 동시성 문제는 다 맞춥니다. (O = 에러 터짐 / X = 에러 방어함)
| 고립화 수준 (Level) | Dirty Read (오손 읽기) | Non-Repeatable Read (모순성) | Phantom Read (유령 읽기) |
|---|---|---|---|
| 0. Read Uncommitted | O (터짐) | O | O |
| 1. Read Committed | X (방어!) | O (터짐) | O |
| 2. Repeatable Read | X | X (방어!) | O (터짐) |
| 3. Serializable | X | X | X (방어!) |
📢 섹션 요약 비유: 트랜잭션 고립화 수준은 호텔 프런트(DB 엔진)가 VIP 손님(트랜잭션)을 위해 **'객실의 문단속(Lock)을 4단계로 세팅해 주는 강도 조절 다이얼'**입니다. **레벨 0(Read Uncommitted)**은 객실에 아예 문짝이 없는 텐트입니다. 손님이 팬티(미확정 데이터 Dirty Data)를 갈아입는 걸 동네 사람들이 지나가며 다 쳐다보는 미친 속도의 100% 개방 상태입니다. **레벨 1(Read Committed)**은 객실에 얇은 문을 달았습니다. 최소한 옷을 다 갈아입고(COMMIT) 문을 열고 나와야만 남들이 내 모습을 볼 수 있습니다(더티 리드 완벽 차단). 오라클이 선택한 가성비 방패입니다. **레벨 2(Repeatable Read)**는 내가 방 안의 사과(데이터)를 쳐다보는 순간 사과에 강철 자물쇠(Lock)를 채워, 내가 퇴실할 때까지 청소부(UPDATE)가 절대 사과를 못 건드리게 막아 모순성(앞뒤가 다른 현상)을 완벽히 차단합니다. 하지만 천장으로 몰래 들어와 배 1개를 툭 던져놓고 가는(INSERT) 귀신 짓은 못 막습니다(팬텀 리드 취약). 가장 빡센 **레벨 3(Serializable)**은 아예 호텔 해당 층의 복도(테이블/범위) 전체에 철조망 바리케이드를 쳐버립니다. 내가 방을 나갈 때까지 바퀴벌레 한 마리도 층에 진입을 못 하므로 귀신(유령 읽기)조차 100% 완벽하게 차단되지만, 다른 손님들이 복도 밖에서 엘리베이터도 못 타고 10시간 대기해야 하는, 성능을 악마에게 팔아 안전을 산 극단적 통제입니다.