2009-09-04 1 views
1
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
BEGIN TRAN 

DECLARE @res INT 

EXEC @res = sp_getapplock 
@Resource = 'This a Lock ID 3', 
@LockMode = 'Exclusive', 
@LockOwner = 'Transaction', 
@LockTimeout = 60000, 
@DbPrincipal = 'public' 


if @res < 0 
begin 
    declare @errorMessage nvarchar(200) 

     set @errorMessage = case @res 
    when -1 then 'Applock request timed out.' 
    when -2 then 'Applock request canceled.' 
    when -3 then 'Applock involved in deadlock' 
    else 'Parameter validation or other call error.' 
end 

raiserror (@errorMessage,16,1) 
end 

/* 
INSERT AND UPDATE STATEMENTS HERE 
... 
... 
*/ 

COMMIT TRANSACTION -- THIS RELEASES THE APPLOCK 

RETURN 0; 
END TRY 

BEGIN CATCH 

-- ROLLBACK TRANSACTION IF NEEDED 
IF @@TRANCOUNT > 0 
    ROLLBACK 

/* 
Exception handling stuff here. Should I call sp_releaseapplock? 
... 
... 
*/ 

-- return the success code 
RETURN -1;  

END CATCH 
+0

중복 : http://stackoverflow.com/questions/1380707/sql-2005-spgetapplock-when-to-call- 출연 알리미 –

답변

0

sp_getapplock에서

잠금이 해제됩니다.

따라서 롤백 할 필요가 없습니다.

그러나 안전하게하고 싶으면 CATCH 블록을 검사하고 먼저 APPLOCK_TEST으로 테스트하십시오. 일반적으로 이것은 우리가 가지고 있지 않은 마지막 블록 일 것입니다.

나는 그것을 항상 여기에서 실행하므로 항상 실행됩니다. 세션이 계속되거나 연결 풀링이 활성 상태를 유지하면 (지금 당장 잊어 버리십시오) 종료 직전이 아닌 경우 COMMIT/ROLLBACK에 의존합니다. 물론, CATCH 블록을 놓친 것은 어쨌든 심각한 중단 오류가 될 것입니다 ...