Sql Server:锁定select语句返回的所有记录

时间:2013-01-08 12:16:45

标签: sql sql-server

我有一种情况,我需要从表中选择一些记录,将这些记录的主键存储在临时表中,并对记录应用独占锁,以确保没有其他会话处理这些记录。我用锁定提示完成了这个:

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

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

1 个答案:

答案 0 :(得分:0)

也许设置不同的隔离级别并使用行锁表提示是你要找的?

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

WITH (ROWLOCK)

或者将XLOCK和ROWLOCK结合起来可能会有什么作用?

文档说:

  

XLOCK

     

指定在事务>完成之前采取并保持排他锁。如果使用ROWLOCK,PAGLOCK或TABLOCK指定,则独占锁适用于>适当的粒度级别。

我自己也没试过。