1. 문제 상황
1.1 Lock Wait Timeout
1.2 문제 상황 뜯어보기
2. 파고 들기 - DB Lock
2.1 Lock 기본 개념
2.2 X-Lock vs S-Lock
2.3 Lock의 범위
3. 결론
3.1 Lock Wait Timeout의 원인
3.2 교훈
추가 QnA with 잼선생
InnoDB에서는 인덱스 기준으로 락을 건다고 하잖아. 그러면 인덱스 리프 노드 하나가 통째로 락을 걸려나? 레코드 하나만 걸 수 있나? 그리고 테이블 페이지에도 락이 걸릴 수 있나? 인덱스를 타고 내려갈 때 타는 노드들은 다 락이 걸리나?
1. 결론: 리프 노드 '통째로'가 아니라 '콕 집어서' 잠급니다.
가장 중요한 결론부터 말씀드리면, InnoDB는 레코드 단위(Row-Level)로 락을 겁니다. * Q: 인덱스 리프 노드(페이지) 하나가 통째로 락이 걸리나?
- A: 아니요. 한 페이지(16KB) 안에 레코드가 100개 있다면, 내가 수정하려는 **1개의 레코드(와 그 갭)**만 잠깁니다. 옆에 있는 다른 레코드는 다른 트랜잭션이 얼마든지 건드릴 수 있습니다.
- Q: 그럼 락 정보는 어디에 저장되나?
- 재미있는 점은, 락을 관리하는 물리적인 정보(Lock Bit)는 해당 페이지(Page) 안에 비트맵 등으로 저장됩니다.
- "이 페이지의 3번째 레코드가 잠겼음"이라고 페이지에 표시해두는 방식이라, 공간 효율이 매우 좋고 오버헤드가 적습니다. (메모리에 객체를 따로 만드는 방식보다 가벼움)
2. 인덱스를 타고 내려갈 때: Lock vs Latch
질문하신 **"내려갈 때 타는 노드들은 다 락이 걸리나?"**가 핵심입니다. 여기서 **락(Lock)**과 **래치(Latch)**를 구분해야 합니다.