224. 다중 버전 동시성 제어 (MVCC, Multi-Version Concurrency Control) - 오라클 기본 원리 읽기 쓰기 충돌 방지 스냅샷 락 없음 언두 세그먼트 블로킹 완화

핵심 인사이트: (현대 RDBMS 동시성 제어의 끝판왕) 오라클(Oracle)과 MySQL(InnoDB) 개발진이 외쳤다. "야! 214번 공유 락(Read)은 지들끼린 동시 통과시켜서 참 좋았어. 근데 누군가 엑셀을 뜯어고치고(Write) 있으면 철문이 쾅 잠겨버려서, 그냥 눈으로만 구경(Read)하려던 불쌍한 손님 10만 명까지 밖에서 무한 대기(Blocking)를 타야 하잖아!! 왜 글 쓰는 놈 1명 때문에 조회하는 10만 명이 피해를 봐야 해?! 당장 쇳덩어리 자물쇠 다 부숴버려!! 쓰기(Write)하는 놈은 그냥 방 안에서 피 터지게 수술하게 내비둬!! 대신, 수술하기 0.1초 전의 멀쩡했던 '과거 데이터 사진(스냅샷 Snapshot)'을 복사해서 뒷주머니(Undo 공간)에 찔러 놔! 그리고 밖에서 구경하러(Read) 온 10만 명한테는 철문을 잠그지 말고, 그 뒷주머니에 숨겨둔 '과거 사진'을 무한대로 쫙쫙 뿌려줘서 읽게 만들어라!! 그럼 쓰는 놈은 피 튀기며 쓰고, 읽는 놈들은 자물쇠 하나 없이 빛의 속도로 과거 데이터를 조회하잖아!!" 쓰는 놈과 읽는 놈이 평생 서로를 방해하지 않고 마이웨이를 걷게 만든 인류 최고의 타협점, MVCC다.

Ⅰ. 기존 락킹(Locking) 기술의 끔찍한 병목

  • 기존 2PL(자물쇠) 세상의 절대 진리: "읽기와 쓰기는 물과 기름이다."
  • 누군가 데이터를 수정(Write/X-Lock)하고 있으면, 읽으려는 놈(Read/S-Lock)은 락이 풀릴 때까지 영원히 문 밖에서 병목에 걸려 대기(Blocking)해야 했습니다.
  • 쇼핑몰 관리자가 "상품 1,000개 일괄 가격 수정!"을 때리는 10분 동안, 전국의 손님들이 상품 검색을 못 하고 쇼핑몰이 하얗게 멈추는 대재앙이 터집니다.

Ⅱ. MVCC (다중 버전 동시성 제어)의 마법 🌟

위의 미친 딜레마를 찢어버린 현대 오라클(Oracle), MySQL(InnoDB), PostgreSQL의 영혼이자 심장입니다.

  • 개념: 데이터베이스에 업데이트(Write)가 발생할 때, 엑셀의 원본을 무식하게 덮어써서 지워버리지 않고, 업데이트되기 이전의 '과거 구버전 데이터(사진)'를 차곡차곡 뒷주머니(Undo 영역)에 여러 개(Multi-Version) 저장해 두었다가, 다른 트랜잭션이 해당 데이터를 조회(Read)하러 올 때 무거운 자물쇠(Lock)로 대기시키지 않고 그 트랜잭션의 시작 시간에 딱 맞는 '과거 버전의 사진'을 제공하여 블로킹(대기) 없이 초고속 읽기를 보장하는 혁명적 기법입니다.

Ⅲ. MVCC를 관통하는 단 하나의 황금 명제 🌟 핵심 기출 🌟

DB 면접과 정보처리기사에 죽어라 나오는 이 문장을 절대 잊지 마십시오.

"MVCC 환경에서는 '읽기(Read)'가 '쓰기(Write)'를 방해(Blocking)하지 않고, '쓰기(Write)'도 '읽기(Read)'를 절대 방해(Blocking)하지 않는다!"

  • 기존엔 쓰기(X-Lock)가 들어오면 읽기(S-Lock)를 다 쫓아냈지만, 이젠 서로 투명 인간처럼 무시하고 지나갑니다. (단, 같은 엑셀 칸을 둘 다 고치려는 '쓰기 vs 쓰기(Write-Write)' 충돌은 사진으로 해결 안 되므로 예전처럼 락을 걸고 대기시킵니다.)

Ⅳ. 언두 세그먼트 (Undo Segment) - "과거 사진관" 🌟

어떻게 쓰기와 읽기가 투명 인간이 될까요?

  1. 관리자가 에어팟 가격을 20만 원에서 **'25만 원'**으로 올리는 수술(Write)을 시작합니다.
  2. 오라클 엔진은 영리하게 20만 원이었던 **'수술 직전의 과거 스냅샷 사진'**을 찰칵 찍어 **언두 세그먼트(Undo Segment / 롤백 세그먼트)**라는 은밀한 지하 창고에 쑤셔 박아둡니다.
  3. 관리자가 열심히 25만 원으로 뜯어고치고(아직 COMMIT 전) 있는데, 고객(T2)이 쇼핑몰에서 에어팟 가격을 조회(Read)하러 접속합니다.
  4. 오라클 엔진의 마술: "어? 지금 메인 엑셀 칸은 관리자가 피 튀기며 수술 중이네? 자물쇠 걸고 기다려? 아니! 고객아, 지저분한 메인 방 보지 말고 저기 지하 창고(언두 세그먼트)에 있는 **'20만 원짜리 과거 사진'**이나 시원하게 읽고 0.001초 만에 집에 가!"
  5. 고객은 대기 시간 0초(Lock-Free)로 안전한 20만 원짜리 확정 데이터를 읽고 평화롭게 쇼핑을 마칩니다. (오손 읽기 방지 완벽 달성)

Ⅴ. 세상에 공짜는 없다 (트레이드오프)

  • 속도와 안전을 다 씹어먹었지만 치명적인 독이 있습니다.
  • 관리자가 하루 종일 데이터를 수만 번 업데이트(Write)하면, 지하 창고(언두 세그먼트)에 1분 전 사진, 10분 전 사진, 1시간 전 사진(Multi-Version) 수만 장이 끝도 없이 복사되어 쌓입니다!
  • 재앙: 너무 오랫동안 낡은 트랜잭션이 안 끝나고 뻗대고 있으면, 이 수만 장의 과거 사진(쓰레기) 데이터가 삭제(Garbage Collection)되지 못하고 하드디스크를 터뜨려버리거나 꽉 막혀 시스템이 뻗는 치명적 약점(Undo 공간 고갈 ORA-01555 에러)을 달고 삽니다. 주기적인 청소가 생명입니다.

📢 섹션 요약 비유: 기존 락킹(Locking) 기법은 박물관의 벽화(데이터)를 복원가(트랜잭션)가 덧칠(Write)하고 있을 때, 그 벽화 앞을 아예 시멘트 벽으로 막아버리는 **'무자비한 폐쇄 공사'**입니다. 복원 공사가 끝날 때까지 10만 명의 관람객은 벽화를 단 1초도 볼 수 없고(Read 차단), 분노하여 박물관을 박살 냅니다(대기 병목 폭발). 이를 구원한 마법 **MVCC(다중 버전 동시성 제어)**는 복원가가 덧칠을 시작하기 0.1초 전에 **'원본 벽화의 완벽한 3D 홀로그램 사진(과거 스냅샷)'**을 찰칵 찍어서 벽화 바로 앞에 허공에 띄워두는 **'초현실 가상 현실 박물관'**입니다. 복원가가 뒤에서 피 터지게 붓질을 하든 망치질을 하든 10만 명의 관람객은 1%도 기다릴 필요가 없습니다! 복원가를 아예 쳐다보지도 않고, 허공에 띄워진 그 '깔끔한 과거 홀로그램 원본 사진(Undo 데이터)'을 딜레이 제로(Lock Free)로 마음껏 감상하며 번개처럼 박물관을 지나쳐갑니다. '그림 그리는 놈(Write)'과 '그림 보는 놈(Read)'이 물리학적으로 서로를 1초도 멈춰 세우지 않게 만든(블로킹 완벽 소멸) 이 위대한 환영 마술 덕분에, 현대의 쇼핑몰과 은행 시스템 수만 개가 대규모 트래픽 폭주 속에서도 딜레이 없이 미친 듯이 매끄럽게 굴러가는 절대 엔진의 법칙입니다.