我试图将SQL Server表用作消息队列。 一个进程在表中执行批量插入。 第二个查询表并在处理完行后删除行。
我的问题是:如果插入和select / delete事务生成行级锁,我怎样才能最好地避免两个进程之间的锁定问题?
答案 0 :(得分:0)
我会调查sp_getapplock和sp_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
;