Intent Lock

의도 잠금은 하위 행 잠금의 존재를 상위 테이블에 표시한다

테이블 잠금 요청이 들어올 때 모든 행 잠금을 훑지 않도록, 트랜잭션은 행 S/X 잠금을 잡기 전에 테이블에 IS/IX/SIX 같은 표식을 남긴다. 표는 상위 레벨의 빠른 충돌 판단이고, 같은 행 충돌은 행 잠금에서 다시 판단한다.

1. 표식 확인 테이블에 남은 IS/IX/SIX부터 본다.
2. 범위 요청 S/X처럼 넓은 요청은 표에서 바로 걸러진다.
3. 대기 조건 IX 보유 중 Table S 요청이면 행 전체 검사를 피한다.
4. 행 충돌 IX끼리 허용돼도 같은 행 X/X는 별도 대기다.
T1 UPDATE row 10
Table IX행 X 예정 표시
Row 10 X실제 쓰기 잠금
commit까지 보호DBMS/격리 수준에 따라 다름
상위 표식과 하위 잠금이 함께 있어야 테이블 잠금 요청이 충돌을 빠르게 알 수 있다.
T2 UPDATE row 20
Table IXT1의 IX와 호환
Row 20 X다른 행이면 진행 가능
같은 행은 별도 충돌행 X/X에서 대기
IX+IX 허용은 “모든 쓰기가 허용”이 아니라 테이블 표식끼리만 허용이라는 뜻이다.
T3 LOCK TABLE S
Table S 요청테이블 전체 공유 읽기
보유 IX 발견하위 행 쓰기 존재
대기모든 행을 검사하지 않음
의도 잠금의 핵심 효과는 대기 시간을 줄이는 것이 아니라 충돌 검사 비용을 줄이는 것이다.
요청 \ 보유
IS
IX
S
SIX
X
IS
허용IS 공존
허용행 단계
허용S 공존
허용S 의도
대기X 충돌
IX
허용행 단계
허용행 X 확인
대기S 충돌
대기SIX 충돌
대기X 충돌
S
허용S 의도
대기IX 충돌
허용S 공존
대기행 X 있음
대기X 충돌
SIX
허용S 의도
대기IX 제한
대기S 제한
대기SIX 충돌
대기X 충돌
X
대기표식 있음
대기표식 있음
대기S 충돌
대기SIX 충돌
대기단독 실행
IS
허용IS, IX, S, SIX
대기X
IX
허용IS, IX
대기S, SIX, X
S
허용IS, S
대기IX, SIX, X
SIX
허용IS
대기IX, S, SIX, X
X
허용보유 잠금이 없을 때
대기기존 잠금이 하나라도 있으면