커서에서 '업데이트 대기'를 언제 사용해야 합니까?
어떤 경우에 우리는 사용해야 합니까?for update nowait
커서로
사용.for update nowait
행을 사용 중으로 만들고 커밋 또는 롤백이 실행될 때까지 잠금을 가져옵니다.잠금을 획득하려는 다른 세션에는 다음과 같은 오류 메시지가 표시됩니다.ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
잠금이 해제될 때까지 기다리는 대신.
세션 1:
CURSOR abc_cur
IS
select * from dept where deptno =10 for update nowait;
여기서 행은 커서가 닫히거나 커밋/롤백이 실행될 때까지 잠깁니다.한편 세션 2의 다른 사용자가 동일한 레코드에 액세스하려고 하면 아래와 같은 오류가 발생합니다.
세션 2:
select * from dept where deptno =10 for update nowait;
이 사용자는 첫 번째 세션에서 잠긴 동일한 레코드를 업데이트하거나 삭제할 수도 없습니다.
ERROR at line 1:
`ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired`
사용: 이제 특정 레코드 집합에 대해 일부 조작을 수행하고 다른 세션의 다른 사용자가 사용자의 데이터를 재정의하지 않으려면 먼저 레코드를 잠가야 합니다(사용)for update nowait
그런 다음 조작을 수행합니다.조작을 마치면 커서를 닫고 커밋합니다.
EDIT 임시에 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;
세션 2에서 세션 1의 스크립트가 계속 실행되는 동안 다음을 실행합니다.
select * from temp;
10 rows found
세션 1의 스크립트가 실행 중인 동안 세션 2에서 동일한 스크립트를 실행하는 경우
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 instead of waiting the lock to release.
사용.for update
을 제외하고nowait
절다음 작업을 수행합니다.
- 해당 레코드(또는 해당 레코드)가 잠겨 있는지 확인합니다.
- 잠겼으면 더 이상 잠기지 않을 때까지 기다립니다.
- 새 잠금으로 레코드를 잠그면 다음 시간까지 레코드가 잠깁니다.
commit
또는rollback
실행됩니다.
사용.for update
와 함께nowait
절다음 작업을 수행합니다.
- 해당 레코드(또는 해당 레코드)가 잠겨 있는지 확인합니다.
- 잠겨 있으면 기다리지 않고 오류 메시지와 함께 종료합니다.
- 레코드가 잠기지 않으면 새 잠금으로 레코드를 잠급니다. 이 잠금 장치는 다음 시간까지 레코드를 잠급니다.
commit
또는rollback
실행됩니다.
이전 답변의 예제는 세션 1이 잠기는 경우에도 작동합니다.for update
을 제외하고nowait
세션 2는 다음을 사용하는 동안 절입니다.nowait
절
도움이 되길 바랍니다.
언급URL : https://stackoverflow.com/questions/13248239/when-should-i-use-for-update-nowait-in-cursors
'programing' 카테고리의 다른 글
파이썬 요청의 응답을 읽으려면 어떻게 해야 합니까? (0) | 2023.07.17 |
---|---|
TypeScript에서 함수 인터페이스를 구현할 수 있습니까? (0) | 2023.07.07 |
container-registry.oracle.com/database/enterprise 에 대해 꺼내기 액세스가 거부되었습니다. (0) | 2023.07.07 |
어떻게 t-sql의 "tinyint"를 c#에서 정수로 변환할 수 있습니까? (0) | 2023.07.07 |
휴대용 코드는 long long을 사용해야 합니까, int64_t를 사용해야 합니까? (0) | 2023.07.07 |