我试图使用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;在此事务运行时,我为两个表都运行了insert,它们都在等待事务提交。我应该怎么做才能锁定某些行进行读取和删除,同时保持表的可用性?
对于该记录,select会产生数万条记录。这些表具有聚集的主键,并且状态列具有索引。
发布于 2011-02-04 20:23:52
我不建议尝试单独锁定某些行。我认为你会遇到比你试图解决的更多的问题。遇到您所描述的锁定问题的原因是因为插入的行数与表中的行数相比。根据SQL Server的判断,锁从行锁升级到页锁再到表锁。
我认为您最好在小得多的事务批次中插入行,以减少锁的数量。换句话说,尝试在一个事务中一次插入100行,看看您是否获得了您认为可以接受的锁定性能。
https://stackoverflow.com/questions/4897846
复制相似问题