228. Read Uncommitted (레벨 0) - 고립화 수준 0단계 트랜잭션 커밋 안된 데이터 오손 읽기 Dirty Read 동시성 최고 무결성 최하
핵심 인사이트: (227번 고립화 4단계 중 0레벨) "야! 엑셀 1칸에 1명만 들어가서 자물쇠 거는 짓(Lock) 다 치워버려! 엑셀 문짝을 확 다 뜯어버리고 10만 명이 한꺼번에 쳐다보게 만들어!! 지금 수술실 안에서 앞놈이 환자 심장을 떼고 피가 철철 나고 있는 '미완성 수술 중(아직 COMMIT 전)' 상태야? 알 게 뭐야 ㅆㅂ 그냥 뒤따라온 구경꾼 10만 명한테 그 피투성이 덜 익은 환자 심장(가짜 쓰레기 데이터)을 모니터로 다 보여줘버려!!! 물론 그 앞놈이 수술 실패해서 '아 취소(ROLLBACK)!!' 치고 환자 심장 원상복구 해버리면, 아까 피투성이 심장 쳐다봤던 구경꾼 10만 명은 세상에 존재하지도 않는 허깨비를 보고 간 꼴(Dirty Read 재앙)이 되겠지! 하지만 어때?! 자물쇠를 단 1개도 안 썼으니까 서버 체감 속도와 동시성(성능)만큼은 우주 최고로 뚫렸잖아!!" 무결성을 악마에게 팔아치우고 속도만 취한 미친 노브레이크 덤프트럭, 레벨 0이다.
Ⅰ. 자물쇠(Lock)의 완전한 멸종 선언
- 227번에서 트랜잭션 고립화(Isolation) 수준은 0~3 레벨이 있다고 했습니다.
- **Level 0 (Read Uncommitted)**는 이름 그대로 **"네가 아직 도장(COMMIT)을 안 찍어서 세상에 확정되지도 않은(Uncommitted) 덜 익은 쓰레기 데이터마저도 나는 쿨하게 그냥 쌩으로 읽어버리겠다(Read)"**는 가장 밑바닥의 헐렁한 방어막입니다.
- 쓰기(Write)나 읽기(Read) 연산에 그 어떠한 213번 S-Lock, X-Lock 쇠사슬도 두르지 않습니다.
Ⅱ. 일관성의 완벽한 붕괴 (어떤 재앙이 터지는가?) 🌟 핵심 🌟
방어막이 0cm 이므로, 202번에서 배운 병행 제어의 5대 지옥이 모조리 다 터져버립니다.
1. 오손 읽기 (Dirty Read) 100% 폭발 🌟
- 이 레벨을 쓰면 하늘이 두 쪽 나도 이 에러를 피해 갈 수 없습니다. (205번 복습)
- A가 잔고를 10만 원에서 **'5만 원'**으로 고치는 중입니다. (아직 덜 끝났음,
COMMIT안 함) - B가 조회하러 옵니다. 자물쇠가 없으니 B는 그 덜 익은 찌끄러기 **'5만 원'**을 그대로 읽어(Read)서 화면에 띄웁니다.
- 1초 뒤 A가 에러가 나서
ROLLBACK해버려 다시 10만 원이 됩니다. - B는 세상에 없는 가짜 5만 원을 믿고 쇼핑을 해버리는 **오손 읽기(Dirty Read)**의 먹잇감이 됩니다.
2. 모순성(Non-Repeatable Read) & 유령 읽기(Phantom Read)
- 당연히 내가 읽는 도중에 남이 고치고 도망가든(모순성), 새로운 놈을 몰래 밀어 넣고 도망가든(유령 읽기) 방어할 수단(Lock)이 전혀 없으므로 시원하게 다 털립니다.
Ⅲ. 도대체 이런 쓰레기를 왜 쓰는 걸까? (도입의 트레이드오프)
데이터가 박살 나는데 이 레벨을 쓰는 회사가 있을까요? 있습니다!
- 미친 극강의 동시성(성능) 🌟: 아무도 자물쇠로 문을 잠그지 않기 때문에(No Blocking), 아무도 밖에서 무한 대기(Wait)를 하지 않습니다. 수만 명이 쏜 10만 개의 쿼리가 0.001초 만에 논스톱 프리패스로 디스크를 쓸고 지나갑니다.
- 언제 쓸까?: "정확성 100%"가 필요 없는 곳입니다. **네이버 실시간 뉴스 기사의 '조회수'나 '좋아요 수'**입니다. 좋아요 수가 10,000개인데, 더티 리드가 좀 터져서 중간에 쓰레기 데이터가 섞이는 바람에 좋아요 숫자가 10,001개로 1개 정도 틀리게 뜬다고 세상이 멸망하나요? 아무도 신경 안 씁니다! 이런 단순 통계 수집이나 대충 보여주는 조회용 쿼리에서는 이 레벨 0을 때려서 속도를 미친 듯이 뽑아내는 것이 현명한 아키텍트입니다. (반대로 은행 결제에서는 절대, 네버 쓰면 안 됩니다.)
📢 섹션 요약 비유: **Read Uncommitted (레벨 0)**은 호텔 주방에서 벌어지는 **'미완성 요리 훔쳐 먹기 묵인법'**입니다. 주방장(트랜잭션 A)이 프라이팬에 스테이크 고기를 올리고 아직 피가 뚝뚝 떨어지는 상태로 소금 간(Write)을 하고 있습니다. 요리가 다 안 익었고 "서빙해!(COMMIT)" 종도 안 쳤습니다(Uncommitted). 근데 굶주린 홀서빙 알바(트랜잭션 B)가 자물쇠 없는 주방 문을 열고 쑥 들어와서는, 그 피투성이 덜 익은 고기(Dirty Data)를 포크로 푹 찍어서 손님 테이블로 가져가 버립니다(Read). 손님은 생고기를 씹어 먹고 배탈이 납니다(오손 읽기 Dirty Read 대참사). 주방장은 뒤늦게 "어, 고기 다 탔네 이거 버려(ROLLBACK)!"라고 소리치지만 이미 손님 배 속엔 유령 생고기가 들어가 있습니다. 식당의 요리 완성도(데이터 무결성)는 0점으로 개판이지만, 음식이 나오는 속도(동시성과 성능)만큼은 세상에서 제일 빨라서 10초 만에 손님상에 미완성 음식들이 쏟아져 나오는 속도 몰빵 엉망진창 뷔페 시스템입니다.