sp_getapplock @lockResult返回代码位置

时间:2017-08-30 12:53:34

标签: sql-server stored-procedures transactions deadlock

以下存储(名为“sp_getNextObj”)过程预先形成选择更新插入

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得到它的值时?

1 个答案:

答案 0 :(得分: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