[英]Sql Server: Lock all records returned by select statement
我遇到一种情况,我需要从表中选择一些记录,将这些记录的主键存储在临时表中,并对这些记录应用排他锁,以确保没有其他会话处理这些记录。 我通过锁定提示来完成此操作:
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
问题在于,更多的记录被锁定,超出了必要。 我只想锁定实际插入到临时表中的记录。 我最初是在表上设置一个标志以指示该记录正在使用中(而不是使用锁定提示),但这存在问题,因为如果情况阻止处理一个或多个记录,数据库将处于无效状态。
也许正在设置其他隔离级别并使用行锁表提示是您要寻找的东西?
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
和
WITH (ROWLOCK)
也许结合使用XLOCK和ROWLOCK可能会成功?
该文件说:
XLOCK
指定要获取并持有排他锁,直到事务>完成。 如果用ROWLOCK,PAGLOCK或TABLOCK指定,则排他锁适用于适当的粒度级别。
我自己还没有尝试过。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.