0

我知道锁定一行以防止被读取可能有点不寻常,但在这种情况下它有点相关。对于 SQL Server 2005 中的行级锁,如何为读取和写入锁定一行?谢谢!

4

1 回答 1

2

简短的回答是,它不能完成。

您可以通过页面锁定做出“最佳尝试”来防止对行进行读取(以对并发性产生相当大的负面影响为代价)。

SELECT ... WITH (PAGLOK,XLOCK)

如果您可以在一个页面上获得排他锁,那么从其他会话对该页面的读取将被有效地阻止。但是注意:即使在聚集索引中的页面上获得了排他锁,仍然不会阻止读取器从非聚集索引中读取行值。所以你仍然没有真正阻止所有读取。

排他行锁(而不是表或页锁)对于阻塞读取器基本上是无用的,因为会话和查询可以轻松解决排他行锁。(会话可以解决具有事务隔离级别的锁,查询可以使用WITH (NOLOCK)提示解决它们。)

SQL Server 锁定是一个相当复杂的主题,我不打算在这里深入研究。

真正的问题(RThomas 在他的评论中强调,是弄清楚为什么你需要防止读取一行。无论是什么原因,很可能会证明获得排他行(或页)锁不是最好的(或对)解决您试图解决的问题。

于 2012-07-19T18:59:57.017 回答