SELECT FOR UPDATE는 트랜잭션 기간 동안 선택된 행을 잠그는(Lock) SQL 문입니다. 이는 다른 트랜잭션이 해당 행을 수정하거나 삭제할 수 없음을 의미합니다. 트랜잭션이 커밋되거나 롤백될 때까지 잠금이 유지됩니다. NOWAIT 옵션은 SELECT FOR UPDATE 문에 추가하여 다른 트랜잭션에 의해 이미 잠긴 선택된 행이 있으면 오류가 즉시 반환되도록 지정할 수 있습니다.
SELECT FOR UPDATE NOWAIT 사용 예는 다음과 같습니다:
테이블 이름이 temp인 테이블에 10개의 행이 있다고 가정하고 세션 1에서 다음 스크립트를 실행합니다:
DECLARE
CURSOR abc IS SELECT * FROM temp FOR UPDATE NOWAIT;
temp abc%ROWTYPE;
BEGIN
OPEN abc;
-- do slow stuff here
CLOSE abc;
COMMIT;
END;
세션 1의 스크립트가 여전히 실행 중인 동안 세션 2에서 다음을 실행하면:
SELECT * FROM temp;
10개의 행이 반환됩니다.
그러나 세션 1의 스크립트가 여전히 실행 중인 동안 아래와 같이 세션 1과 동일한 스크립트를 실행하면:
DECLARE
CURSOR abc IS SELECT * FROM temp FOR UPDATE NOWAIT;
temp abc%ROWTYPE;
BEGIN
OPEN abc;
-- do slow stuff here
CLOSE abc;
COMMIT;
END;
오류 메시지가 반환됩니다: ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired.
NOWAIT 옵션이 없는 예는 다음과 같습니다:
테이블 이름이 temp인 테이블에 10개의 행이 있다고 가정하고 세션 1에서 다음 스크립트를 실행합니다:
DECLARE
CURSOR abc IS SELECT * FROM temp FOR UPDATE;
temp abc%ROWTYPE;
BEGIN
OPEN abc;
-- do slow stuff here
CLOSE abc;
COMMIT;
END;
세션 1의 스크립트가 여전히 실행 중인 동안 세션 2에서 다음을 실행하면:
SELECT * FROM temp;
10개의 행이 반환됩니다.
그러나 세션 1의 스크립트가 여전히 실행 중인 동안 세션 1과 동일한 스크립트를 실행하면: