SQLP
시험 직전 요약장
판단 기준과 헷갈리는 개념, 대표 예제를 짧게 확인하세요.
SELECT FOR UPDATE 실전: OF·NOWAIT·WAIT·SKIP LOCKED
원래 이론 →판단 기준
표를 좌우로 밀어 나머지 열을 확인하세요. 키보드: ←·→, Home·End
| 혼동하기 쉬운 판단 | 정확한 기준 |
|---|---|
OF o.status는 status Column만 잠근다 | ORDERS의 선택 Row를 잠글 Table로 식별한다 |
NOWAIT는 Transaction 전체를 자동 Rollback한다 | 현재 문장이 즉시 실패하며 Transaction 종료는 Application이 결정한다 |
WAIT n은 모든 종류의 Lock에 대한 전체 SQL Timeout이다 | Row Lock 대기 정책이며 Exclusive Table Lock과 상위 Timeout은 별도 고려한다 |
SKIP LOCKED는 모든 잠금을 건너뛴다 | 이미 잠긴 대상 Row를 건너뛰는 Queue 지향 정책이다 |
| Fetch Size를 줄이면 잠긴 Row 수도 줄어든다 | FOR UPDATE Cursor는 OPEN 시 결과 Row를 잠근다 |
OF를 생략해도 변경할 Table만 자동으로 잠긴다 | Join에 참여한 모든 Table의 선택 Row가 Lock 대상이 될 수 있다 |
FETCH FIRST와 FOR UPDATE를 바로 조합할 수 있다 | row_limiting_clause와 for_update_clause는 함께 사용할 수 없다 |
헷갈리는 개념
SELECT FOR UPDATE로 획득한 Row Lock은 Cursor를 닫거나 Application에서 결과를 모두 읽었다고 해제되지 않습니다. Lock은 해당 Transaction의 COMMIT 또는 ROLLBACK까지 유지됩니다.
표를 좌우로 밀어 나머지 열을 확인하세요. 키보드: ←·→, Home·End
| 구분 | 일반 SELECT | SELECT FOR UPDATE |
|---|---|---|
| 읽기 방식 | 일관 읽기 | 선택 Row를 확인하고 Lock 획득 |
| Row Lock 선점 | 하지 않음 | 수행함 |
| 다른 일반 SELECT | 차단하지 않음 | 일반 일관 읽기는 대체로 계속 가능 |
| 다른 DML·FOR UPDATE | Row Lock으로 막지 않음 | 동일 Row 변경·Lock 요청이 대기 또는 실패 |
| 해제 시점 | 해당 없음 | Transaction 종료 |
따라서 사용자 입력, 승인 대기, 장시간 계산, 외부 API 호출을 Row Lock 보유 구간에 넣지 않는 것이 기본입니다.
대표 계산·예제
예를 들어 FOR UPDATE OF o.status를 사용해도 조건이 넓어 주문 10만 건이 선택되면 ORDERS의 많은 Row가 잠길 수 있습니다. PK·
내 최근 연습 오답
현재 브라우저의 연습 채점 기록에서 공개된 단원과 연결된 오답을 확인합니다.
오답 기록을 확인하고 있습니다.