2013-02-19 126 views
2

我使用SQL Server的鎖定功能喜歡下面SQL服務器sp_getapplock和sp_releaseapplock拋出異常時釋放鎖

sp_getapplock 
sp_releaseapplock 

我指定@LockOwner = 'Session'

但每次扔初級講座異常:

com.microsoft.sqlserver.jdbc.SQLServerException:無法釋放應用程序鎖(數據庫主體:'dbo',資源:'89999'),因爲它不是特地舉行

歡迎任何建議或想法!

REGARDS!

CREATE PROCEDURE [SETLOCK] 
    @... 
AS 
DECLARE 
@RESULT INT; 
BEGIN TRANSACTION 
EXEC @RESULT = sp_getapplock @... 
       @LockOwner = 'Session'; 

IF @RESULT = -3 
BEGIN 
    ROLLBACK TRANSACTION; 
END; 
ELSE 
BEGIN 
    COMMIT TRANSACTION; 
END; 

回答

5

錯誤很明顯:您沒有獲取資源89999上的applock。在調用sp_releaselock時,您必須指定Session(作爲@LockOwner參數的值),鎖定釋放必須發生在與鎖定獲取相同的會話中。另一個可能的原因是獲取/釋放呼叫不平衡(您有額外的版本)。

作爲附註,使用Session作用域鎖定時不需要事務。

+1

嗨Remus,鎖定釋放必須發生在同一會話......我很抱歉,但再問幾句:如何判斷同一會話?如果在代碼中使用相同的連接對象可以嗎?在使用鎖定或釋放時,我已將相同的連接對象傳遞給方法,但發生此錯誤?非常感謝! – Edward 2013-02-19 08:54:31

+0

同一會話〜=相同@@ SPID。它必須是不能關閉/重新打開的相同連接。 – 2013-02-19 09:00:31

+0

@RemusRusanu沒有'Session'這樣的參數。 – 2016-09-02 12:17:55