1

我正在尝试使用 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;

当这个事务正在运行时,我为两个表运行了一个插入操作,他们都在等待它提交。我应该怎么做才能锁定某些行以进行读取和删除但保持表可用?

对于记录,选择结果数以万计的记录。这些表具有聚集的主键,并且状态列具有索引。

4

1 回答 1

1

我不建议尝试单独锁定某些行。我认为你会遇到比你试图解决的更多的问题。您遇到您描述的锁定问题的原因是因为插入的行数与表中的行数相比。锁从行锁升级到页锁再到表锁,由 SQL Server 自行决定。

我认为在更小的事务批次中插入行以减少锁定量会更好。换句话说,尝试在事务中一次插入 100 行,以查看是否获得了您认为可以接受的锁定性能类型。

于 2011-02-04T12:23:51.930 回答