229. Read Committed (레벨 1) - 고립화 수준 1단계 오손 읽기 방지 더티 리드 차단 오라클 기본 트랜잭션 동시성 모순성 발생

핵심 인사이트: (228번 레벨 0의 끔찍한 배탈을 막은 구원자) 228번에서 손님들이 주방에 난입해 덜 익은 피투성이 고기(Uncommitted 찌끄러기 데이터)를 주워 먹고(Dirty Read) 단체로 식중독에 걸렸다. 식당 사장이 빡쳐서 몽둥이를 들었다. "야 ㅆㅂ!! 손님들한테 피 뚝뚝 떨어지는 쓰레기 고기 좀 주지 마!! 당장 주방 문에 '출입 통제선'을 하나 깔아라!! 앞으로 주방장(Write 트랜잭션)이 고기 굽는 수술을 끝내고 프라이팬에 완벽하게 플레이팅을 다 마친 뒤에 '요리 완성!(COMMIT 도장)' 종을 땡! 하고 치기 전까지는, 밖에 있는 그 어떤 손님(Read 트랜잭션) 놈들도 절대 그 고기에 포크를 댈 수 없게 철통 방어해!! 하지만 요리 완성(COMMIT) 도장만 딱 찍히면, 그 순간부터는 10만 명이 들어와서 고기를 다 같이 구경(Read)해도 합격이다!!" 쓰레기 가짜 데이터를 멸종시키며 오라클(Oracle)의 절대 심장이 된 가장 가성비 좋은 국민 방패, 레벨 1이다.

Ⅰ. 오손 읽기(Dirty Read)의 완전한 척결

  • Level 1 (Read Committed): 이름 그대로 **"네가 확실하게 100% 확정(COMMIT) 도장을 찍어 영구 보존시킨 그 '안전한 진짜 데이터(Committed)'만 나는 믿고 읽겠다(Read)!"**는 룰입니다.
  • 방어 메커니즘:
    • T1이 10만 원을 5만 원으로 고칩니다. 하지만 아직 COMMIT을 치지 않았습니다 (피투성이 미확정 상태).
    • 이때 T2가 5만 원을 읽으러 달려옵니다. DB 엔진은 T2의 뺨을 때려 막습니다. "어딜 쓰레기를 처먹어! 멈춰!" (또는 224번 MVCC 흑마법을 써서, T1이 고치기 전의 과거 확정 사진인 '10만 원'을 던져주어 5만 원을 훔쳐보지 못하게 원천 차단합니다.)
    • T1이 드디어 COMMIT! 도장을 찍으면, 그제야 5만 원이 '진짜'로 승격되어 T2가 읽어갈 수 있습니다.
  • 대승리: 205번의 그 끔찍했던 **오손 읽기(Dirty Read)**와 206번 연쇄 복귀(Cascading Rollback) 현상이 우주에서 영원히 소멸합니다.

Ⅱ. 그러나 뚫려있는 빈틈: 모순성(Non-Repeatable Read) 🌟 핵심 기출 🌟

  • 더러운 가짜 데이터를 먹는 병은 고쳤지만, 아직 방어막이 두껍지는 못합니다. (204번 복습)
  • 모순성 시나리오 (에어팟 결제):
    1. 내가 에어팟 가격을 읽었더니 확정된(Committed) 가격인 **'20만 원'**이 정상적으로 잘 읽혔습니다. (오케이!)
    2. 내가 결제 비번을 누르는 5초의 틈바구니!
    3. 애플 관리자가 불쑥 들어와 에어팟 가격을 **'25만 원'**으로 올리고 재빨리 COMMIT(확정) 도장까지 완벽하게 찍어버리고 나갑니다.
    4. 나는 결제 버튼 누르기 전 한 번 더 가격을 읽어봅니다.
    5. 헉?! 가격이 **'25만 원'**으로 올랐습니다!!
  • 결론: 관리자가 25만 원을 확실히 다 익혀서 'COMMIT'까지 한 **'진짜(Committed) 데이터'**이기 때문에, 레벨 1의 룰("커밋된 건 읽어도 돼!")에 의해서 당당하게 프리패스 통과해버린 겁니다!
  • 결국 내가 하나의 방(트랜잭션) 안에서 두 번 읽었는데 앞뒤 값이 달라져서 멘탈이 박살 나는 모순성(반복할 수 없는 읽기, Non-Repeatable Read) 에러는 이 레벨 1 방패로는 막아낼 수가 없습니다(뚫림). + 207번 **유령 읽기(Phantom Read)**도 당연히 못 막고 뚫립니다.

Ⅲ. 세계구급 1티어, 왜 오라클(Oracle)의 기본값인가? 🌟

  • 모순성이 뚫리는데 왜 전 세계 90%의 기업이 쓰는 비싼 오라클 DB는 이 Level 1을 디폴트(기본) 설정으로 깔아놓고 쓸까요?
  • 트레이드오프의 황금비율 (가성비):
    • 레벨 0은 더티 리드가 터져서 은행 계좌가 썩어 문드러져 도저히 못 씁니다.
    • 다음 장의 레벨 2, 레벨 3처럼 자물쇠를 빡세게 걸어서 모순성과 유령을 완벽하게 막아버리면? 10만 명의 손님이 기다리다 서버가 뻗어서 회사가 망합니다.
    • 결국 "가짜 쓰레기 데이터(더티 리드)만 완벽하게 걸러내서 치명상은 피하고, 10만 명의 속도(동시성)를 빵빵하게 뚫어주는" 레벨 1이 대규모 쇼핑몰이나 기업 시스템을 돌리는 가장 완벽한 현실의 가성비 타협점이기 때문입니다.

📢 섹션 요약 비유: **Read Committed (레벨 1)**은 호텔 주방의 **'요리 완성의 종(땡!) 치기 전 절대 서빙 금지법'**입니다. 228번 레벨 0에선 서빙 알바가 피투성이 덜 익은 고기(Dirty Data)를 막 들고 손님(Read)한테 먹여서 식중독(에러)이 터졌습니다. 그래서 주방장(DB 엔진)이 룰을 세웠습니다. "주방장이 프라이팬에서 요리를 완벽하게 다 끝내고, 접시에 담은 뒤 '완성!(COMMIT)' 종을 땡! 치기 전까지는, 홀서빙 놈들아 절대 접시에 손대지 말고 뒤로 물러서서 대기해!!" 이 완벽한 통제 덕분에, 손님들은 무조건 100% 푹 익은 안전한 요리(Committed Data)만 먹게 되어 식중독(오손 읽기, Dirty Read) 대참사가 완전히 사라졌습니다(오라클의 기본값). 하지만 이 룰은 완벽하지 않습니다. 손님이 내일 또 와서 똑같은 '돈가스'를 시켰는데, 주방장이 그사이 요리법을 완전히 바꿔(새로 UPDATE 후 COMMIT 땡!), 어제랑 전혀 다른 끔찍한 맛의 완벽한 퓨전 돈가스를 내옵니다. 손님은 "어? 어제랑 맛이 완전 다르고 모순되잖아!(Non-Repeatable Read 모순성 터짐)" 하고 당황합니다. 주방장은 "어찌 됐든 100% 다 익혀서 종 쳤잖아!(룰 지킴)"라고 당당하게 나옵니다. 식중독(가짜 데이터)은 피했지만 맛의 변덕(모순성)은 허락해 버리며 식당의 회전율(성능)을 극대화한 가성비의 방패막이입니다.