230. Repeatable Read (레벨 2) - 고립화 수준 2단계 트랜잭션 모순성 방지 Non-Repeatable Read 차단 공유 락 유지 MySQL 기본 유령 읽기 취약
핵심 인사이트: (229번 레벨 1의 모순성을 박살 낸 강철 자물쇠) 229번에서 다 익은 안전한 고기(Committed)만 먹게 막았더니 피똥은 안 싼다. 근데 내가 똑같은 메뉴판 엑셀을 1분 간격으로 두 번 읽었는데 가격이 20만 원 ➜ 25만 원으로 휙휙 바뀌어서 멘탈이 나가는 '모순성'의 구멍은 여전히 뚫려있었다. "야 ㅆㅂ!! 내 방(트랜잭션) 안에서 내가 한 번 읽었던 데이터는, 내가 이 방을 완전히 나갈 때(COMMIT)까지 절대 남이 손도 못 대게 꽁꽁 묶어놔야지!! 당장 네가 눈으로 쳐다본(Read) 그 엑셀 칸 위에다가 쇳덩어리 자물쇠(Shared Lock)를 무자비하게 쾅! 채워버려!! 그리고 네가 퇴실(COMMIT)하는 그 찰나의 순간까지 우주가 멸망해도 그 자물쇠를 단 1초도 풀지 말고 꽉 쥐고 있어!! 그럼 네가 방구석에서 그 엑셀을 1만 번을 다시 읽어도(Repeatable Read), 밖에서 도둑(UPDATE)이 들어올 틈이 없으니 가격은 영원히 20만 원으로 100% 똑같이 읽히며 일관성이 지켜지잖아!!" 한 번 찜한 데이터의 수정(UPDATE)을 영구 봉쇄하는 MySQL의 절대 뼈대, 레벨 2다.
Ⅰ. 레벨 1의 모순성(변덕) 뚫림 복습
- 레벨 1(Read Committed)에선 내가 엑셀을 쓱 읽고, 락을 툭 버립니다.
- 내가 잠시 뒤돌아보는 5초의 틈에 해커가 들어와 그 엑셀의 옷 색깔을 '파란색'으로 뜯어고치고(UPDATE) 쿨하게 나갑니다.
- 내가 다시 엑셀을 쓱 읽어보니 옷 색깔이 '빨간색' ➜ '파란색'으로 바뀌어 있는 앞뒤가 안 맞는 미친 현상(Non-Repeatable Read)에 당합니다.
Ⅱ. Repeatable Read (레벨 2)의 강철 방어막 🌟
이 모순을 때려죽이기 위해 자물쇠를 언제 푸느냐의 '타이밍' 룰을 독재적으로 바꿨습니다. (220번 엄격한 2PL과 완벽히 맞닿아 있습니다.)
- 개념: 트랜잭션이 시작되고 데이터에 접근해서 읽기(Read) 위해 공유 락(S-Lock)을 걸었다면, 이 읽기 자물쇠(S-Lock)를 다 읽었다고 중간에 땅에 툭 던지지(Unlock) 못하게 금지하고, 무조건 트랜잭션이 최종 종료(COMMIT)될 때까지 영구적으로 꽉 쥐고 버티게 강제하는 고립화 수준입니다.
Ⅲ. 레벨 2가 막아낸 것과 뚫리는 것 🌟 핵심 기출 🌟
1. 모순성 (Non-Repeatable Read) 완벽 차단 🌟
- 내가 모나리자 가격(20만 원)을 읽으며 자물쇠(S-Lock)를 꽉 채우고 주머니에 열쇠를 넣었습니다.
- 애플 관리자가 25만 원으로 올리려고 수정 락(X-Lock)을 걸러 뛰어옵니다.
- 철벽 방어: 내가 쥐고 있는 S-Lock이 철문을 막아섭니다. "야! 내가 퇴근(COMMIT)하기 전까지는 절대 못 고쳐!" 관리자는 밖에서 무한 대기(Blocking)합니다.
- 나는 10시간 뒤에 다시 가격을 읽어도, 관리자가 못 고쳤으니 영원히 똑같은 '20만 원'을 반복해서 안심하고 두 번 세 번 읽어낼 수 있습니다 (이래서 이름이 Repeatable Read 입니다!).
2. 치명적 구멍: 유령 읽기 (Phantom Read) 👻
방어막이 완벽해 보이지만 허공에서 뚫립니다. (207번 복습)
- 나는
VIP 명단 3명에 꽁꽁 자물쇠를 걸어서 3명의 이름(기존 데이터 UPDATE)은 절대 못 바꾸게 막아냈습니다. - 근데 내가 고개를 돌린 사이, 해커가 문을 열고 빈 공간 구석지에다가 새로운 4번째 인간(유령)을 쓱 하고 몰래 끼워 넣고 튀어버립니다 (새로운 행 INSERT). 자물쇠는 기존의 3명한테만 걸어놨지, 텅 빈 허공에는 자물쇠가 없었기 때문에 속수무책으로 뚫립니다.
- 내가 1분 뒤 다시 VIP 명단을 셌더니 갑자기 '4명'이 튀어나오며 귀신(Phantom Read)에 홀려 통계가 엉망이 됩니다. 이것은 레벨 2로도 막을 수 없습니다!
Ⅳ. 왜 MySQL(InnoDB)의 기본값인가?
- 놀랍게도 오라클은 레벨 1인데, 한국 IT 기업이 가장 사랑하는 MySQL DB는 이 무거운 레벨 2(Repeatable Read)를 디폴트 기본값으로 씁니다.
- 속도가 느려지지 않나요?
- MySQL의 흑마법(MVCC) 🌟: MySQL은 멍청하게 진짜 쇳덩어리 자물쇠(S-Lock)를 걸어서 남을 대기시키지 않습니다! 대신 224번 MVCC(과거 홀로그램 스냅샷) 기술을 극한으로 끌어올립니다. 내가 처음 트랜잭션을 연 10시 시점의 '10시 찰칵 사진'만 평생 내 방구석 홀로그램으로 띄워줍니다. 밖에서 해커가 파란색으로 고치든 말든 내 방에는 평생 10시의 '빨간 옷' 홀로그램만 반복해서 보여주어, 자물쇠 대기(오버헤드) 0%의 빛의 속도로 모순성(Non-Repeatable Read)을 100% 차단해 내는 완벽한 꼼수 예술을 보여줍니다.
📢 섹션 요약 비유: **Repeatable Read (레벨 2)**는 도서관의 **'절대 뺏기지 않는 독서실 책상 점유권'**입니다. 229번 레벨 1의 학생은 책(데이터)을 쓱 보고 제자리에 꽂아둡니다. 잠시 화장실 다녀온 사이 딴 놈이 그 책에 낙서(UPDATE)를 쫙 해놔서, 두 번째 읽으려 보니 책 내용이 바뀌는 모순성(앞뒤 다름)에 멘탈이 털렸습니다. 분노한 2단계(레벨 2)의 룰은 독점입니다! 내가 어떤 책을 딱 집어(Read) 내 독서실 책상에 올린 순간, 그 책에 **강철 수갑(Shared Lock)**을 내 책상과 함께 묶어버립니다. 화장실을 가든 밥을 먹든 내가 오늘 밤 가방 싸서 도서관을 완전히 떠나는(COMMIT) 그 순간까지 수갑은 풀리지 않습니다. 남들은 이 책을 뺏어가서 낙서(UPDATE)를 할 수 없으니, 나는 오늘 밤 내내 수백 번을 똑같은 책을 열어봐도 내용이 100% 똑같이 유지(Repeatable Read 방어)되는 평화를 얻습니다. 하지만 치명적 단점, 빈 공간에 새로 나타나는 유령은 못 막습니다! 내가 책상 위에 책 3권을 수갑으로 묶어놨는데, 딴 놈이 내 책상 구석의 빈 공간에 새로운 불온서적 1권을 쓱 던져놓고 튀는 짓(신규 데이터 INSERT)은 수갑이 빈 공간엔 없으므로 막을 길이 없습니다. 뒤돌아보니 책이 4권으로 불어나는 귀신 현상(Phantom Read)만큼은 여전히 당해버리고 마는 2% 부족한 무결성의 문지기입니다.