락(Lock) 경합 상황을 다루는 방법 중 하나야.
DBMS가 락을 "얻는 과정"과 "풀어주는 과정"을 순서대로 안전하게 관리하려고 나눈 단계야.
단계 | 의미 | 예시 |
---|---|---|
확장(Expand) | 필요한 락을 추가로 잡는 단계 | 트랜잭션이 어떤 row를 업데이트하려고 "Row Exclusive Lock"을 거는 것 |
축소(Shrink) | 쓸모없는 락을 해제하는 단계 | 작업 다 끝났으니 Row Lock을 풀고, Transaction commit 하는 것 |
중요 포인트:
즉, 락을 잡을 때랑 풀 때를 명확히 나눠야 Deadlock 같은 문제를 줄일 수 있어.
Deadlock(교착 상태) 을 피하려고.
만약 락을 잡았다 풀었다를 아무 순서 없이 막 하면,
서로 다른 트랜잭션이 서로 필요한 락을 잡고 대기하다가 꼬여서 Deadlock 이 터질 수 있어.
그래서 PostgreSQL은 원칙적으로:
이 순서를 지키게 설계되어 있어.
[확장 단계]
필요한 락을 하나씩 추가: Row A lock -> Row B lock -> Row C lock
[축소 단계]
작업 끝나고 해제: Row A unlock -> Row B unlock -> Row C unlock
확장(Expand) = 락을 추가하는 것
축소(Shrink) = 락을 해제하는 것이걸 단계별로 구분해서 deadlock을 방지하고, 락 관리 일관성을 확보한다!