2013-02-19 124 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