217. 확장 단계 (Growing Phase) - 2PL 1단계 락킹 획득 전용 공유 락 배타 락 트랜잭션 동시성 데드락 원인

핵심 인사이트: (216번 2PL의 전반전 심화) "야! 2PL 법규의 1단계(확장) 명심해! 네가 창고에 들어갔으면, 네가 요리하는 데 필요한 재료(데이터)의 자물쇠(Lock)란 자물쇠는 죄다 카트에 미친 듯이 쓸어 담기만 해!! 고기 락(X-Lock), 양파 락(S-Lock) 닥치는 대로 쥐어!! 단, 명심해라. 카트에 담았던 자물쇠를 '아 이거 안 쓸래' 하고 바닥에 단 1개라도 던져버리는(Unlock) 그 찰나의 순간!! 너는 확장 단계를 영원히 박탈당하고 다음 단계(축소)로 강제 쫓겨나게 된다!! 락을 쥔 채로 놔주지 않기 때문에, 저쪽에서 파를 쥔 놈과 고기를 쥔 놈이 서로의 재료를 원하며 멱살을 잡고 영원히 멈춰버리는 데드락(교착상태)의 지옥이 바로 이 1단계에서 피어오르는 거다!!" 락을 먹어 치우기만 하는 탐욕의 전반전, 확장 단계다.

(본 문서는 4과목 SE의 클린 아키텍처가 아닌, 5과목 DB의 2PL 확장 단계를 다룹니다.)

Ⅰ. 확장 단계 (Growing Phase)의 명확한 정의 🌟

  • 개념: 트랜잭션이 시작된 후 처음 진입하는 2단계 락킹 프로토콜(2PL)의 제1페이즈입니다.
  • 이 구간에서 트랜잭션은 자신이 읽거나 쓸 데이터에 대해 새로운 자물쇠(S-Lock, X-Lock)를 요청하고 획득(Lock)하는 행위만 무한정 허용됩니다. (점점 쥐고 있는 락의 개수가 늘어나서 '확장 Growing'이라고 부릅니다.)

Ⅱ. 확장 단계의 절대 금지 룰 (Unlock 금지)

  • 트랜잭션은 자물쇠를 모으는 동안, 자신이 이미 쥐고 있는 수십 개의 자물쇠 중 단 1개의 자물쇠라도 절대 풀어서 반납(Unlock)할 수 없습니다.
  • 만약 로직 상 어쩔 수 없이 1개의 자물쇠를 풀게(Unlock) 되는 순간! 시스템은 매정하게 잣대를 들이대며 **"너의 확장 단계는 끝났다. 넌 지금 이 초(Second)부터 218번 '축소 단계'로 넘어갔다."**라고 강제 페이즈 전환(Lock Point 돌파)을 때려버립니다.

Ⅲ. 숨겨진 꿀팁: 락의 업그레이드 (Lock Upgrade)

확장 단계에서 유일하게 허락되는 자물쇠 변신 마술입니다.

  • 상황: 내가 처음엔 홍길동 엑셀 칸을 눈으로만 보려고 **공유 락(S-Lock)**을 쥐고 들어갔습니다. 근데 보다 보니 내용을 좀 고치고 싶어졌습니다.
  • 업그레이드: 확장 단계 내에서는 내가 쥐고 있던 약한 공유 락(S-Lock)을, 뜯어고칠 수 있는 무시무시한 **배타 락(X-Lock)**으로 강화(Upgrade)하는 것이 합법적으로 허용됩니다! (자물쇠를 더 쎈 놈으로 '확장'하는 것이니까요.)
  • 주의: 반대로 X-Lock을 S-Lock으로 약화(Downgrade)시키는 짓은 자물쇠의 힘을 '푸는' 행위와 같으므로 확장 단계에서는 절대 불가능하며, 218번 축소 단계에서만 가능합니다.

Ⅳ. 확장 단계가 낳는 최대의 재앙: 교착 상태 (Deadlock) 🌟 핵심 기출 🌟

왜 2PL을 쓰면 100% 시스템이 가끔 멈추며 데드락이 터질까요? 범인은 바로 이 '확장 단계의 탐욕' 때문입니다.

  • 데드락 시나리오:
    1. 트랜잭션 T1이 홍길동의 자물쇠(Lock A)를 쥐고 확장 단계 꿀을 빨고 있습니다.
    2. 트랜잭션 T2는 이순신의 자물쇠(Lock B)를 쥐고 확장 단계에 있습니다.
    3. 근데 T1이 요리를 끝내려면 이순신 정보(B)가 필요한데, 그걸 T2가 쥐고 안 놔줍니다. (T1 대기)
    4. 동시에 T2는 요리를 끝내려면 홍길동 정보(A)가 필요한데, 그걸 T1이 쥐고 안 놔줍니다. (T2 대기)
  • 절망적인 룰의 충돌: T1T2 둘 다 아직 **1단계(확장 단계)**에 머물러 있습니다. "확장 단계에서는 절대 자기가 쥐고 있는 락을 풀 수 없다(Unlock 금지)!"라는 2PL의 철칙 때문에, 둘 다 양보(Unlock)를 1%도 하지 못하고, 서로의 락만 내놓으라고 평생 멱살을 잡고 기다리는 교착 상태(Deadlock) 지옥에 100% 빠지게 됩니다.

📢 섹션 요약 비유: **확장 단계(Growing Phase)**는 욕심 많은 원숭이 두 마리(트랜잭션 T1, T2)가 좁은 유리병 안에 든 **'바나나(자물쇠 Lock)를 주먹 쥐고 꺼내려는 함정'**과 같습니다. 2PL의 1단계 규칙은 명확합니다. "병 안에 손을 넣어서 바나나를 쥘 수는 있지만, 한 번 쥔 바나나를 절대 놓아버려서는(Unlock) 안 된다!" 원숭이 1호(T1)가 오른손으로 사과 락을 쥐었습니다. 원숭이 2호(T2)는 왼손으로 바나나 락을 쥐었습니다. 이제 1호는 요리를 완성하기 위해 바나나가 필요한데 2호가 쥐고 안 놔줍니다. 2호는 사과가 필요한데 1호가 안 놔줍니다. 두 원숭이는 자기가 쥔 과일을 하나라도 놓으면(Unlock) 규칙 위반으로 1단계에서 쫓겨나기 때문에, 하늘이 두 쪽 나도 절대 자기가 쥔 손을 펴지 않습니다. 결국 두 원숭이는 서로의 과일만 쳐다보며 주먹을 꽉 쥔 채 병 입구에 손이 낀 상태로 굶어 죽어버리는 파멸(Deadlock)을 맞이하게 됩니다. 직렬 가능성(안전성)을 지키기 위해 '절대 놓지 마라'고 강제한 이 확장 단계의 룰이, 역설적으로 두 트랜잭션을 영원한 대기의 감옥에 가둬버리는 DB 교착 상태의 근본 원흉이 되는 것입니다.