2011-02-04 85 views
1

我试图使用ROWLOCK,以防止某些行,而它的运行被更新,但问题是,我不能在所有在运行此使用的表: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; 

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

对于记录,选择结果成千上万的记录。这些表具有群集主键,状态列具有索引。

+2

阅读有关锁升级的此MSDN文章:http://msdn.microsoft.com/en-us/library/ms184286.aspx。特别是:“数据库引擎不会将行锁或键范围锁升级为页锁,但将它们直接升级为表锁”,并且存在锁升级启动的阈值(~5000锁) – AdaTheDev 2011-02-04 12:29:22

+0

可以'当这个运行时,你是否要插入到TableA中? – 2011-12-14 23:48:01

回答

1

我不会建议尝试单独锁定某些行。我想你会碰到比你想解决的问题更多的问题。您遇到上述锁定问题的原因是因为插入的行数与您表中的行数相比。根据SQL Server的判断,锁可从行锁升级为对表锁进行页锁。

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