在SQL Server 2005中,如何针对读取和写入锁定特定行?

时间:2012-07-18 22:46:53

标签: sql-server-2005 locking

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

1 个答案:

答案 0 :(得分:2)

简短的回答是,它无法完成。

您可以通过页锁来防止对行的读取(以牺牲对并发产生的相当大的负面影响)做出“最佳镜头”。

SELECT ... WITH (PAGLOK,XLOCK)

如果您可以获取页面上的独占锁定,则会有效阻止从其他会话中读取该页面。但是注意:即使在聚集索引中的页面上获得了独占锁,仍然不会阻止读取器从非聚簇索引读取行值。所以你仍然没有真正阻止所有的阅读。

独占行锁(而不是表或页锁)对于阻止读者基本上是无用的,因为会话和查询可以轻松地解决独占行锁。 (会话可以解决具有事务隔离级别的锁定,并且查询可以使用WITH (NOLOCK)提示解决这些问题。)

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

真实的问题(RThomas在他的评论中强调,正在弄清楚为什么你需要阻止读取行。无论什么原因,可能会发现获得独占行(或页面)锁不是最佳(或正确)解决您试图解决的问题。