223. 낙관적 동시성 제어 (Optimistic Concurrency Control) - 트랜잭션 충돌 드뭄 검증 단계(Validation) 락 없음(Lock-free) 롤백 오버헤드
핵심 인사이트: (213번 락킹의 정반대 대척점) 213번 비관적 락(Lock)은 10만 명이 전부 도둑놈 해커라고 의심(비관)하고, 일단 들어올 때 무조건 수갑(Lock)부터 채우고 봤다. 속도가 굼벵이가 됐다. 위대한 천재들이 소리쳤다. "야!! 넷플릭스 영화 조회 서버를 봐!! 하루에 1억 명이 클릭하는데 99.9%가 다 눈으로만 보는(Read) 착한 천사들이고, 영화 포스터 수정(Write)하는 나쁜 놈은 하루에 1명뿐이잖아!! 충돌이 거의 안 일어나는데 왜 천사 1억 명한테 들어올 때마다 무거운 수갑(Lock)을 1억 번이나 찰칵찰칵 채우며 오버헤드를 낭비해 미친놈아!! 당장 자물쇠 다 버려!! 1억 명 그냥 프리패스로 다 들여보내서 각자 임시 메모리에 신나게 쇼핑하게 냅둬(낙관적)!! 그러다 나갈 때(COMMIT 직전) 딱 1번만 출구 검색대를 세워놓고 '너 혹시 아까 남이 덮어쓴 쓰레기 먹고 고쳤냐?' 하고 검사(Validation)해서 걸리는 놈 한 명만 족쳐서 암살(ROLLBACK)시켜버리면 훨씬 쾌적하잖아!!" 락(Lock)을 버리고 사후 검열로 인터넷 트래픽을 뚫어버린 하이패스, 낙관적 검증 기법이다.
Ⅰ. 의심병 환자(비관적 제어)의 오버헤드
- 216번 2PL(자물쇠)이나 222번 타임스탬프는 모두 비관적(Pessimistic) 제어입니다. "네 놈은 무조건 충돌을 일으킬 나쁜 놈이야!"라고 믿고 사전에 락을 걸고 연산을 감시합니다.
- 데이터 조회(Read) 위주의 현대 웹사이트에서는 이 자물쇠 통제 비용(Locking Overhead) 자체가 미친 낭비로 작용해 서버를 느려 터지게 만듭니다.
Ⅱ. 낙관적 동시성 제어 (OCC, Optimistic Concurrency Control) 🌟
- 개념: "설마 동시 충돌이 나겠어?"라고 낙관적(긍정적)으로 가정합니다. 트랜잭션이 수행되는 동안에는 데이터에 어떠한 자물쇠(Lock)도 절대 걸지 않고 자유롭게 연산을 허용한 뒤, 트랜잭션이 최종 종료(COMMIT)되기 직전에만 데이터가 훼손되었는지 단 한 번 사후 검사(Validation)를 수행하여, 문제없으면 도장을 찍고 문제 있으면 가차 없이 ROLLBACK(사형)시키는 동시성 제어 기법입니다.
Ⅲ. OCC의 거침없는 3단계 생애 주기 🌟 핵심 기출 🌟
자물쇠 없이 어떻게 안전을 지킬까요? 트랜잭션의 인생을 3등분으로 나눕니다.
1. 판독(Read) 단계 - "임시 창고에서 놀기"
- 트랜잭션이 진짜 리얼 DB 쇳덩어리(디스크)에 있는 진짜 엑셀 칸을 직접 찢고 고치지 않습니다!
- 진짜 데이터를 자기만의 **개인 임시 메모리(Local Workspace/Cache)**로 몰래 한 부 복사해 와서, 그 짝퉁 복사본 위에서 지지고 볶고 마음대로 연산(Write)을 수행합니다.
- 락(Lock)이 아예 없으므로 10만 명이 들어와도 딜레이 0초로 미친 듯이 각자 복사본을 뜯어고칩니다.
2. 검증(Validation) 단계 - "운명의 출구 검색대" 🌟 (하이라이트)
- 내 복사본 요리가 끝났습니다. 이제 진짜 리얼 DB 쇳덩어리에 이 짝퉁 결과를 밀어 넣어 덮어쓰고 퇴근(COMMIT)하려 합니다.
- 잠깐! 출구 검색대에서 DB 엔진이 멈춰 세웁니다.
- "어이 형씨, 당신 아까 낮 12시에 '에어팟 10만 원' 복사해서 방구석 들어갔지? 근데 네가 방구석에서 10시간 요리하는 동안, 오후 3시에 다른 놈이 들어와서 진짜 DB의 에러팟 가격을 '20만 원'으로 바꿔치기하고 퇴근했어! 넌 지금 네 방구석에서 옛날 쓰레기 데이터(10만 원)를 가지고 요리를 해온 거야!!"
- 직렬 가능성(충돌) 검사: 내가 요리하는 틈바구니에 남이 내 원본을 오염시켰는지 타임스탬프 기록을 대조하며 날카롭게 색출해 냅니다.
3. 기록(Write) 단계 - "천당과 지옥"
- 통과 (오염 안 됨): "오케이, 네가 방에서 요리하는 동안 아무도 진짜 DB를 안 건드렸네! 안전해! 네가 요리한 복사본 결과물을 진짜 DB 쇳덩어리에 쾅! 덮어씌워라(Write)! 성공(COMMIT)!!"
- 사형 (충돌 적발): "야 ㅆㅂ 남이 아까 원본 고쳐놨잖아! 넌 갱신 손실(덮어쓰기) 재앙을 일으킬 폭탄이야! 네가 만든 복사본 데이터 싹 다 파쇄기에 갈아버려(ROLLBACK)!! 너 임마 1단계(판독)로 쫓겨나서 처음부터 10시간짜리 요리 새로 다시 시작해(Restart)!!"
Ⅳ. 언제 최고의 무기가 되는가? (트레이드오프)
- 대박 치는 곳: 위키백과(Wikipedia)처럼 99만 명이 글을 읽기만(Read) 하고, 1명만 글을 고치는 시스템. 충돌 확률이 거의 0%에 수렴하므로 락(Lock) 오버헤드를 아낀 만큼 속도가 빛을 뚫습니다.
- 폭망하는 곳: 수강 신청, 주식 거래소처럼 10만 명이 동시에 똑같은 삼성전자 주식(Write)을 사겠다고 덤벼드는 곳. 1명만 출구 검사 통과하고 나머지 99,999명이 검사대에서 목이 잘려(ROLLBACK) 처음부터 재시작(Restart)하는 생지옥이 펼쳐져 서버 CPU가 폭발합니다. 여기선 그냥 무거운 자물쇠(비관적 2PL)를 채워 줄을 세우는 게 100배 현명합니다.
📢 섹션 요약 비유: 기존의 **비관적 제어(자물쇠 락킹)**는 쇼핑몰 출입문에 **'무장 경비원 100명'**을 세워두고, 손님이 물건 1개를 만질 때마다 신원 조회를 하고 수갑을 채우며 감시하는 **'편집증적 교도소'**입니다. 좀도둑(데이터 충돌)은 100% 완벽히 막아내지만, 입장 수속이 너무 느려 선량한 손님 10만 명이 정문 밖에서 텐트를 치고 굶어 죽습니다(성능 붕괴). 이를 비웃으며 등장한 **낙관적 동시성 제어(OCC)**는 경비원과 잠금장치를 몽땅 다 치워버린 **'무인 프리패스 하이퍼마켓'**입니다. "도둑질하는 나쁜 놈(충돌) 거의 없잖아! 그냥 10만 명 다이렉트로 막 들여보내!(Lock Free, 동시성 극대화)" 손님들은 안에서 마음껏 물건을 카트에 쓸어 담습니다. 그런데 방심은 금물입니다. 마트를 빠져나가는 찰나의 **'계산대 출구(Validation 검증 단계)'**에서 숨어있던 무자비한 AI 스캐너가 작동합니다. 계산대를 지나는 순간, 손님이 카트에 담은 물건 중 방금 전 다른 손님이 가로챈 물건과 바코드(데이터)가 꼬인 게 단 1개라도 발견되면?! 얄짤없이 몽둥이로 때려서 카트를 쓰레기통에 엎어버리고(ROLLBACK), **"입구로 돌아가서 처음부터 쇼핑 다시 해 이 새끼야!(Restart)"**라고 내쫓아버립니다. 1만 명이 물건을 평화롭게 살 때는 줄을 설 필요가 없어 지구 최고의 스피드를 내지만, 한정판 나이키 신발 1개(충돌이 심한 데이터)를 놓고 1만 명이 싸울 때는 9,999명이 출구에서 빰을 맞고 무한 재시작의 늪에 빠져버리는, 사람(트래픽)을 믿는 자만이 쓸 수 있는 궁극의 노브레이크 하이패스 전술입니다.