2017-09-14 83 views
0

我试图使用SQL Server表作为消息队列。 一个进程向表中执行批量插入。 第二个查询表并删除正在处理的行。SQLServer防止两个进程之间的锁定问题

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

回答

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 

;