2017-08-30 51 views
1

以下存儲(名爲 「sp_getNextObj」)過程預製件選擇更新插入sp_getapplock @lockResult返回代碼位置

DECLARE @LockResults int 
BEGIN TRAN 
    EXEC @LockResults = sp_getapplock 
     @Resource = 'sp_getNextObj', 
     @LockMode = 'Exclusive', 
     @LockOwner = 'transaction', 
     @LockTimeout = '3000' 

     IF @LockResults<0 
     BEGIN 
      ROLLBACK 
      RETURN 
     END 

    UPDATE ... 

    INSERT INTO ... 

    SELECT * FROM ... 

    -- release the SP lock 
    EXEC sp_releaseapplock @Resource = 'sp_getNextObj' 
    COMMIT 
END 

我使用sp_getapplock設置代碼鎖區域,

問題是:

是需要在sp之後還是之前的狀態,意思是:什麼時候@LockResult得到它的值?

回答

0

sp_getapplock將序列化訪問存儲過程中代碼塊內的關鍵部分。它可以位於存儲過程的主體中,用於保護要序列化訪問的部分。

如果sp_getapplock呼叫,隨後COMMITROLLBACK之間的代碼調用名爲X則該存儲過程將只在與鎖呼叫者的情況下被保護的存儲過程。其他命令可以在鎖的代碼上下文之外調用X.

PROCEDURE Y 
BEGIN 
    DO SOME STUFF 
    ... 
    LOCK HERE --> Critical Section 
     ... 
     CALL X 
    COMMIT OR ROLLBACK HERE --> Release Lock 
    ... 
    DO SOME STUFF 
END 
+1

在我的情況下,我保護這個sp本身,是否意味着整個sp鎖當線程在sp? – shdr

+1

然後,您需要將事務/鎖定調用置於存儲過程的開始位置。只要鎖名稱沒有改變,那麼對存儲過程的每次調用都將導致獨佔執行。請確保始終在從您的proc返回之前釋放鎖。 –