SQL Server에서 앱 잠금 요청을 어떻게 취소합니까?


25

sp_getapplock 저장 프로 시저는 다음과 같은 반환 값을 가지고 :

0 : 잠금이 동 기적으로 부여되었습니다.
1 : 호환되지 않는 다른 잠금이 해제 될 때까지 잠금이 성공적으로 부여되었습니다.
-1 : 잠금 요청 시간이 초과되었습니다.
-2 : 잠금 요청이 취소되었습니다.
-3 : 잠금 요청이 교착 상태 피해자로 선택되었습니다.
-999 : 매개 변수 유효성 검사 또는 기타 호출 오류를 나타냅니다.

sp_getapplock데이터 액세스 계층에서 호출하기위한 래퍼를 작성 중이며 어떤 상황에서 -2가 반환되어 설명적이고 유용한 예외가 발생할 수 있는지 알고 싶습니다. -1과 -3의 반환 값이 무엇을 의미하는지 분명히 알 수 있으며 해당 값을 반환하는 테스트 조건을 쉽게 만들 수 있습니다. -2의 반환 값을 얻으려면 어떻게해야합니까?

답변:


5

sp_getapplock랩퍼 프로 시저 의 소스를 보면 -999를 제외한 모든 리턴 값은 기본 sys.xp_userlock 내부 스토어드 프로 시저 에서 시작 됩니다. 주의 이벤트 (클라이언트 쿼리 시간 초과 또는 클라이언트 쿼리 취소 설명)에 의해 요청이 취소되면 내부 proc이 -2를 반환 할 것입니다. 그러나 sp_getapplock배치를 취소 한 후에는 RETURN명령문을 포함하여 추가 코드가 실행 되지 않습니다 . 결과적으로 -2 리턴 코드가 내부적으로 리턴 될 수 있지만 클라이언트가 값을 얻는 실제적인 방법은 없습니다.

이 이론이 맞다고 가정하면, 처음부터 요청을 취소 한 클라이언트이기 때문에 더 설명적인 메시지로 -2로 변환하는 데 아무런 가치가 없습니다.

디버거를 사용하여 SQL 데이터베이스 엔진 코드를 단계별로 확인하여 폴에게 맡길 것입니다 :-)


1

sp_getapplock은 물리적 개체가 아닌 세마포어에 대한 잠금을 만듭니다 (MSDN 별). 동일한 문자열과 호환되지 않는 잠금 모드를 가진 sp_getapplock 인 경우에만 다른 프로세스를 차단합니다.

따라서 더 높은 권한을 가진 사용자가 잠금을 취소하거나, 서버 프로세스가 잠금을 취소하거나, 저장 프로 시저를 실행하는 사용자 또는 관리자가 잠금 프로세스를 종료하는 등의 상황에서 잠금 요청이 취소됩니다. 설명이 "시스템 또는 다른 사용자에 의해 잠금이 취소되었습니다." 잠금을 취소 한 실제 프로세스 / 사용자를 어떻게 결정할지 잘 모르겠습니다.


-1

sp_releaseapplock이라는 해당 릴리스 응용 프로그램 잠금 저장 프로 시저가 있습니다.

나는 혼동 "SQL에서 뮤텍스"라는 제목의 기사를 썼다 여기 제어 응용 프로그램의 흐름이 저장 프로 시저를 사용하는 방법에 대한 SQL Server 중앙에 있습니다.


4
제목의 질문에 답변 한 것 같지만 실제 질문은 "어떤 상황에서 sp_getapplock이 -2를 반환합니까?"입니다.
Martin Smith

잠금 요청이 취소되었습니다. 실제로, 그것은 이상한 것입니다. 프로세스가 취소되었다는 것을 모르고 잠금 요청을 어떻게 취소합니까! MS가 제공 한 것 이외의 의미있는 오류 ( "잠금 요청이 취소되었습니다")를 제공 할 수 없음을 승인해야 할 수도 있습니다.
Toby
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.