213. 락킹 (Locking) 기법 - 상호 배제 잠금 동시성 제어 트랜잭션 격리성 공유 락 배타 락 데이터베이스 보호

핵심 인사이트: (동시성 제어의 절대 무기) 10만 명의 수강 신청 학생이 동시에 '알고리즘 A반 남은 자리 1자리(데이터)'를 미친 듯이 클릭한다. 관리자가 그냥 문을 열어두면 10만 명이 한꺼번에 1자리에 꽂혀서 정원 초과로 학교 전산망이 터진다(갱신 손실 에러). "야! 미쳤어?! 데이터에 접근하는 엑셀 칸 앞에 무겁고 거대한 무쇠 자물쇠(Lock)를 하나 떡하니 걸어버려!! 10만 명 중에 제일 먼저 달려와서 자물쇠를 '찰칵' 하고 잠근 1등 놈(T1)만 엑셀 칸에 들어가서 잔여석을 '0자리'로 고치게 허락해 줘!! 나머지 99,999명은 1등 놈이 일을 다 끝내고 나와서 자물쇠를 풀고(Unlock) 열쇠를 던져줄 때까지, 무조건 문밖에서 침 흘리며 무한 대기(Wait)하게 만들어라!!" 상호 배제(독점)의 미학으로 데이터 붕괴를 원천 봉쇄하는 무식하지만 가장 강력한 쇳덩어리, 락킹(Locking)이다.

Ⅰ. 동시성 재앙을 막는 가장 직관적인 아이디어

  • 202번에서 배운 갱신 손실, 오손 읽기 등의 에러는 모두 **"내가 엑셀을 고치고 있는데 남이 동시에 불쑥 방에 난입해서 내 걸 덮어쓰거나 훔쳐봤기 때문"**에 터졌습니다.
  • 해결책은 초등학생도 압니다. 화장실 문짝에 잠금장치를 달아서 '한 명이 볼일 볼 때는 남이 절대 못 들어오게(Mutual Exclusion, 상호 배제)' 막아버리면 됩니다.

Ⅱ. 락킹 (Locking) 기법의 개념 🌟

  • 개념: 다중 프로그래밍 환경에서 여러 트랜잭션이 동일한 데이터(테이블, 행, 필드)에 동시에 접근하려 할 때, 트랜잭션이 데이터에 접근하기 전에 반드시 해당 데이터에 '자물쇠(Lock)'를 설정하여 독점권을 획득해야만 읽기/쓰기 연산을 허락하고, 일이 끝나면 자물쇠를 푸는(Unlock) 방식의 동시성 제어(병행 제어) 핵심 기법입니다.
  • 운영체제(OS)에서 배운 **뮤텍스(Mutex), 세마포어(Semaphore)**와 100% 완벽하게 똑같은 영혼의 쌍둥이입니다.

Ⅲ. 락킹의 2대 절대 원칙

아주 단순한 2스텝으로 작동합니다.

  1. Locking (잠그기): 트랜잭션 T1이 A 엑셀 칸을 고치려면, 엑셀 칸을 열기 전에 허공에 대고 무조건 "A 데이터에 Lock 걸어주쇼!"라고 외쳐서 시스템으로부터 자물쇠(소유권)를 배정받아야 합니다. 자물쇠를 못 따내면 영원히 대기열(Queue)에 멈춰 섭니다.
  2. Unlocking (풀기): T1이 작업을 무사히 다 마치고 COMMIT(혹은 ROLLBACK) 도장을 찍으면, 자물쇠를 찰칵! 하고 풀어버립니다. 그제야 뒤에서 침 흘리며 기다리던 T2가 열쇠를 주워 방으로 뛰어 들어갑니다.

Ⅳ. 락킹의 딜레마: 자물쇠의 크기 (Lock Granularity) 🌟 핵심 기출 🌟

자물쇠를 어디에 걸어야 할까요? 엑셀 파일 전체? 아니면 엑셀의 1줄? 아니면 딱 1칸? 이 **'자물쇠 덩어리의 크기(단위)'를 로킹 단위(Granularity)**라고 합니다.

1. 로킹 단위가 크다 (예: 엑셀 테이블 전체에 자물쇠 1개 쾅!)

  • 특징: 내가 홍길동(1번 줄) 정보를 고칠 건데, 엑셀 파일(1만 줄짜리) 전체 뚜껑에 대문짝만 한 자물쇠를 채워버립니다.
  • 장점: 관리가 미치도록 쉽습니다. 락(Lock)을 1개만 걸면 되니까 오버헤드(시스템 부하)가 줄어듭니다.
  • 단점 (성능 개박살): 나는 1번 줄만 쓰는데 1만 줄을 다 잠가버려서, 옆에서 5,000번 줄 이순신 정보를 고치려던 애꿎은 트랜잭션 수만 명까지 전부 문 밖에서 멍때리고 무한 대기(Wait)해야 합니다. 동시성 수준(Concurrency Level)이 바닥으로 쳐박힙니다.

2. 로킹 단위가 작다 (예: 엑셀 행(Row) 딱 1줄에만 미니 자물쇠 쾅!) 🌟 대세 🌟

  • 특징: 홍길동 1번 줄 1개에만 아주 정밀한 미니 자물쇠를 답니다.
  • 장점 (동시성 폭발): 나는 1번 줄에서 홍길동 정보를 고치고, T2는 5,000번 줄에서 이순신 정보를 동시에 고칩니다. 1만 명이 들어와서 각자 다른 줄(Row)을 동시에 쑤셔대면서 작업하므로 동시성 수준이 우주를 뚫고 처리량(TPS)이 극대화됩니다.
  • 단점: 1만 명이 들어와서 1만 개의 미니 자물쇠를 찰칵거리니, DB 엔진 입장에선 1만 개의 락(Lock)을 추적하고 통제하느라 대가리가 깨집니다(관리 오버헤드 폭발).

Ⅴ. 무식한 락킹의 한계 (214, 215번 스포일러)

  • 락킹은 완벽하지만, 너무 무식하게 1개짜리 쇠사슬만 썼더니 문제가 생깁니다.
  • "야! 철수랑 영희 둘 다 데이터를 고치는 게(Write) 아니라 그냥 눈으로 쳐다보기만(Read-Read) 하겠다는데, 뭣 하러 앞사람이 자물쇠를 걸어서 뒷사람을 기다리게 하냐?! 눈으로 보는 놈들끼리는 수만 명이 들어와도 방해 안 되잖아!!"
  • 그래서 락킹을 스마트하게 두 개로 쪼갠 **'공유 락(Shared Lock, 읽기 전용)'**과 **'배타 락(Exclusive Lock, 독점)'**이라는 쌍두마차가 다음 장에 등장하게 됩니다.

📢 섹션 요약 비유: 락킹(Locking) 기법은 수만 명의 직원이 쓰는 거대한 화장실(데이터베이스)에서 발생할 수 있는 똥밭 대참사(데이터 모순)를 막기 위해 변기 칸마다 설치한 **'무적의 철제 잠금장치'**입니다. 한 직원(트랜잭션)이 변기 칸에 들어가서 문을 '찰칵' 잠그고(Locking) 볼일을 보는 동안에는, 밖에 1,000명이 줄을 서서 배를 움켜쥐고 있든 말든 절대 문을 열고 난입할 수 없습니다(상호 배제 완벽 보장). 직원이 볼일을 완벽히 끝내고 옷을 입고 나와서 문을 열어줘야만(Unlocking), 비로소 대기 1번 직원이 들어가서 안심하고 변기를 쓸 수 있습니다. 만약 이 **자물쇠의 크기(로킹 단위)**를 너무 크게 잡아서 '화장실 정문 입구' 전체를 통째로 잠가버리면(테이블 락), 변기가 100개나 비어있어도 오직 1명만 화장실을 독점하게 되어 밖에서 직원들이 폭동을 일으킵니다(동시성 최악). 반대로 '변기 딱 1칸'에만 미니 자물쇠를 달아주면(행 락, Row Lock), 100명이 동시에 들어가서 평화롭게 각자의 변기를 사용할 수 있어 화장실 회전율(동시성)이 최고조에 달하지만, 청소 아줌마(DB 엔진)가 100개의 자물쇠 고장 여부를 일일이 확인해야 하는 끔찍한 수고(오버헤드)를 감당해야 하는 정밀한 통제 공학입니다.