2013-01-08 63 views
0

我有一种情况,我需要从表中选择一些记录,将这些记录的主键存储在临时表中,并按顺序对记录应用排它锁以确保没有其他会话处理这些记录。我使用锁定提示完成了这个操作:SQL Server:锁定select语句返回的所有记录

begin tran 
insert into #temp 
select pk from myTable with(xlock) 
inner join otherTables, etc 
(Do something with records in #temp, after which they won't be candidates for selection any more) 
commit 

问题是还有很多记录被锁定而不是必要的。我只想只有锁定实际插入到临时表中的记录。我最初在表上设置了一个标志来指示该记录正在使用中(与使用锁提示相反),但这有问题,因为如果情况阻止了一个或多个记录的处理,数据库将处于无效状态。

回答

0

也许设置不同的隔离级别,并使用rowlock表提示是你在找什么?

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 

WITH (ROWLOCK) 

也许结合XLOCK和ROWLOCK可能做的伎俩?

文档说:

XLOCK

指定独占锁要采取和保持到事务>完成。如果使用ROWLOCK,PAGLOCK或TABLOCK进行指定,则独占锁适用于>适当的粒度级别。

虽然我还没有尝试过。