2012-07-18 96 views
0

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

+5

您是否关心数据一致性或数据安全?您所问的内容有点不寻常 - 因此了解您的真实意图可能会让您“更好你可以通过实现这种类型的锁提供更多关于你想要避免(或实现)的信息: – RThomas 2012-07-18 23:22:31

+0

@marc_s:如果它是真的,那将是很好的;但它不完全是真的(阻止写入,是的;阻塞读取,否)。其他会话可以轻松解决独占行锁和r ead行值。 – spencer7593 2012-07-19 19:10:34

+1

@marc_s - 即使在'readcommitted'上,行上的一个'X'锁也不一定阻止读者。见[缺少共享锁的情况](http://sqlblog.com/blogs/paul_white/archive/2010/11/01/read-committed-shared-locks-and-rollbacks.aspx) – 2012-07-19 19:11:28

回答

2

简而言之,它是无法完成的。

您可以做一个“最佳镜头”努力,以防止使用页面锁定对行进行读取(代价是对并发造成严重的负面影响)。

SELECT ... WITH (PAGLOK,XLOCK) 

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

独占行锁(而不是表或页锁)对于阻止读者基本上是无用的,因为会话和查询可以很容易地绕过独占行锁。 (Sessions可以解决事务隔离级别的解决方法,并且查询可以使用WITH (NOLOCK)提示来解决这些问题。)

SQL Server锁定是一个相当复杂的主题,我不打算试图深入此处。

真正的问题(RThomas在他的评论中强调)是在弄清楚为什么需要防止读取一行。不管是什么原因,很可能会发现获取独占行(或页)锁定不是您正在尝试解决的问题的最佳(或正确)解决方案。