我正在尝试使用rowlock来阻止某些行在运行时进行更新,但问题是我在运行时根本无法使用这些行:
set transaction isolation level repeatable read;
go
begin try
begin transaction;
insert into tableB with(rowlock)
select * from tableA with(rowlock) where status = 1
commit transaction;
end try
begin catch
if xact_state() <> 0
begin
rollback transaction;
end
end catch;
我在这个事务运行时为两个表运行了一个插件,他们都等待它提交。如何锁定某些行以进行读取和删除但保持表可用?
对于记录,选择结果成千上万条记录。这些表具有聚簇主键,而状态列具有索引。
答案 0 :(得分:1)
我不建议尝试单独锁定某些行。我认为你会遇到比你想要解决的更多问题。您遇到锁定问题的原因是因为插入的行数与表中的行数相比较。根据SQL Server的不同,锁会从行锁升级到页锁到表锁。
我认为在更小的事务批处理中插入行会更好,以减少锁定的数量。换句话说,在事务中尝试一次插入100行,以查看是否获得了可接受的锁定性能类型。