0

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

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

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

4

1 回答 1

0

也许您正在寻找设置不同的隔离级别并使用行锁表提示?

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

WITH (ROWLOCK)

或者也许结合 XLOCK 和 ROWLOCK 可能会成功?

文档说:

XLOCK

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

虽然我自己没有尝试过。

于 2013-01-08T12:29:03.430 回答