214. 공유 락 (Shared Lock / Read Lock, S-Lock) - 읽기 허용 쓰기 불가 동시성 극대화 로킹 기법 다중 트랜잭션 데이터베이스 조회 최적화
핵심 인사이트: (213번 무식한 락킹의 반란) 미술관의 '모나리자 그림(데이터)' 앞에 10만 명의 관람객이 서 있다. 만약 213번의 무식한 자물쇠(배타 락) 1개만 쓴다면? 관람객 1명이 그림을 볼 때 모나리자 방에 철문을 닫아걸고 혼자서 1분 동안 감상하게 해야 한다. 뒤에 99,999명은 밖에서 땡볕을 맞으며 무한 대기한다. 관장님이 빡쳐서 소리쳤다. "야 멍청아!! 관람객들이 모나리자에 붓으로 물감을 덧칠(Write)하겠다는 것도 아니고, 뒷짐 지고 그냥 눈으로 쳐다만(Read) 보겠다는데 왜 문을 잠가!! 눈으로 보는 건 10만 명이 동시에 쳐다봐도 그림이 닳냐?! 당장 '읽기 전용 유리문(공유 락 S-Lock)'으로 바꿔 달아!! 다른 놈들이 그림을 '수정'하려 들면 유리문으로 철통 방어하되, 그냥 똑같이 '눈으로 구경(Read)'만 하겠다는 착한 놈들은 수만 명이든 다 유리문 안으로 들여보내서 다 같이 쳐다보게 만들란 말이야!!" 시스템의 숨통을 확 트이게 만들어준 너그러운 평화의 방패, 공유 락이다.
Ⅰ. 단순 락킹의 치명적 멍청함
- 데이터베이스 쿼리의 90%는 데이터를 수정(UPDATE)하는 게 아니라, 엑셀 칸을 단순히 눈으로 조회(SELECT)하는 '읽기(Read)' 트랜잭션입니다.
- "조회(Read) 트랜잭션 A"와 "조회(Read) 트랜잭션 B"가 동시에 똑같은 엑셀 칸을 읽는다고 해서 202번 갱신 손실 같은 에러가 날까요? 절대 안 납니다! 둘 다 눈으로 보기만 하는데 데이터가 변할 리가 없죠.
- 근데 무식하게 자물쇠를 하나만 운영하면, 조회하려는 A 때문에 뒤에 줄 선 B, C, D가 끝도 없이 멈춰 서서 서버가 터져버립니다.
Ⅱ. 공유 락 (Shared Lock / S-Lock)의 탄생 🌟
자물쇠를 두 종류로 쪼개어 영리하게 분리했습니다.
- 개념: 트랜잭션이 어떤 데이터 항목에 대해 **'오직 읽기 연산(Read/SELECT)'만 수행하려고 할 때 엑셀 칸에 찰칵! 채우는 '너그러운 특수 자물쇠'**입니다. (다른 말로 Read Lock이라고도 합니다.)
Ⅲ. 공유 락(S-Lock)의 위대한 2대 통제 룰 🌟 핵심 기출 🌟
1. 끼리끼리 환영 (S-Lock 간의 무한 동시 허용) 🌟
이게 S-Lock을 만든 유일한 이유입니다.
- 내가(T1) 홍길동 데이터에 1등으로 도착해서 **S-Lock(공유 락)**을 떡하니 걸고 기분 좋게 모나리자를 눈으로 감상(Read)하고 있습니다.
- 1초 뒤 뒤따라온 T2, T3 놈들이 "어? 형님 S-Lock 거셨네요? 저도 S-Lock(공유 락) 걸고 같이 좀 눈으로 읽어도 될까요?" 라고 부탁합니다.
- 결과: 100% 무한 통과! S-Lock이 걸린 데이터에는, 남들이 S-Lock을 덧대어 거는 것을 수만 번이라도 환영하며 쿨하게 승인해 줍니다. 10만 명의 읽기(Read) 트랜잭션이 딜레이(Wait) 단 0.1초도 없이 완벽하게 동시 실행되어 동시성(Concurrency)이 하늘을 뚫고 우주로 승천합니다.
2. 폭력(쓰기)에 대한 무자비한 철벽 방어 (X-Lock 절대 거부) 🌟
천사 같던 공유 락이 악마로 돌변하는 순간입니다.
- T1부터 T10까지 10명이 평화롭게 S-Lock을 걸고 홍길동 엑셀 칸을 읽고(Read) 있었습니다.
- 찰나의 순간, 악당인 해커(T11)가 들어와서 "야 싹 다 비켜! 내가 홍길동 이름 지우고 '이순신'으로 이름 덮어쓸(Write/UPDATE) 거야! 나 배타 락(X-Lock) 좀 걸자!!"라고 소리칩니다.
- 결과: 철통 거부 펀치! 데이터에 얇은 S-Lock이 단 1개라도 걸려있다면, 덮어쓰기를 하려는 무자비한 배타 락(X-Lock)의 접근을 하늘이 두 쪽 나도 거부하고 밖으로 쫓아냅니다. 해커(T11)는 10명이 S-Lock을 다 풀고 퇴근할 때까지 영원히 밖에서 쭈그려 앉아 무한 대기(Wait)해야 합니다. 내가 책을 읽고 있는 동안 남이 페이지를 찢어버리거나 글씨를 지우는 짓(일관성 파괴)을 100% 완벽하게 방어해 내는 철벽의 수호자입니다.
Ⅳ. 도입 효과와 요약
- "읽기(Read)는 서로 무한정 허락(공유)하지만, 쓰기(Write)의 접근은 단 한 발짝도 허락하지 않는다!"
- 이 S-Lock 덕분에 현대 인터넷 쇼핑몰(조회가 90%인 환경)이 서버 폭발 없이 빛의 속도로 상품 목록을 100만 명에게 띄워줄 수 있는 것입니다.
📢 섹션 요약 비유: **공유 락(Shared Lock, S-Lock)**은 도서관의 희귀한 '유리관 속 고서적(데이터)' 전시와 같습니다. 1번 관람객(트랜잭션 T1)이 고서적을 구경(Read)하러 오면, 사서는 책에 '유리 덮개(S-Lock)'를 씌워줍니다. 1분 뒤 2번 관람객, 3번 관람객(T2, T3)이 100명 몰려와 "우리도 책 좀 구경(Read)할게요!"라고 하면 사서는 싱긋 웃으며 "아유, 눈으로 보는 건 수만 명이 같이 봐도 책이 안 닳아요~ 다 같이 들어와서 유리 덮개 너머로 마음껏 공유(Shared)하며 보세요!"라고 무한 동시 입장을 허락합니다(읽기 간의 동시성 극대화). 그런데 관람객들이 한창 책을 구경하고 있는데, 미친 작가 1명(T11)이 펜을 들고 뛰어오며 "야 다 비켜! 나 저 책 내용 지우고 내 맘대로 낙서해서 책 내용 바꿀(Write/X-Lock) 거야!!"라고 소리치며 달려듭니다. 그 순간, 사서(DB 엔진)와 얇아 보이던 유리 덮개(S-Lock)가 철벽으로 돌변하여 "야 이 미친놈아! 지금 100명이 책을 읽고(S-Lock) 있는데 네가 낙서(Write)를 하면 책 내용의 일관성이 박살 나잖아!! 구경꾼 100명이 책 다 읽고 집에 갈 때까지 넌 도서관 문 밖에서 영원히 꿇어앉아 펜 들고 대기(Wait)해!!" 라며 쓰기 작업자의 접근을 무자비하게 틀어막아 버리는, 독자들을 위한 최고의 평화 유지 방패막이입니다.