SQLServer防止两个进程之间的锁定问题

时间:2017-09-14 15:04:30

标签: sql sql-server

我试图将SQL Server表用作消息队列。 一个进程在表中执行批量插入。 第二个查询表并在处理完行后删除行。

我的问题是:如果插入和select / delete事务生成行级锁,我怎样才能最好地避免两个进程之间的锁定问题?

1 个答案:

答案 0 :(得分:0)

我会调查sp_getapplocksp_releaseapplock。然后,两个进程都会尝试在同一个指定的@Resource上获取锁。

基本示例:

DECLARE @LockResult int = NULL
;

BEGIN TRAN MyTransaction

-- Obtain Lock

EXEC @LockResult = sp_getapplock
    @Resource = 'MyResource',
    @LockMode = 'Exclusive',
    @LockTimeout = 10000
;

IF @LockResult IN (0, 1)

    BEGIN

        -- Your process

        EXEC sp_releaseapplock @Resource = 'MyResource'

        COMMIT TRAN MyTransaction

    END

ELSE

    -- Handle failure to obtain lock

;