谁能解释一下在查询中使用with (nolock)的含义,什么时候应该/不应该使用它?

例如,如果你有一个银行应用程序,有很高的事务率,在某些表中有很多数据,在什么类型的查询中nolock是可以的?在某些情况下,你是否应该总是使用它/永远不要使用它?


当前回答

nolock提示合法使用的教科书示例是针对高更新OLTP数据库的报告采样。

举个热门的例子。如果美国一家大型商业银行想要每小时发布一份报告,寻找城市层面的挤兑的最初迹象,那么nolock查询可以扫描每个城市的现金存取款总和的交易表。对于这样的报告,由回滚更新事务引起的微小百分比的错误不会降低报告的价值。

其他回答

我过去常常检索“下一批”要做的事情。在这种情况下,具体是哪个项目并不重要,我有很多用户运行相同的查询。

nolock提示合法使用的教科书示例是针对高更新OLTP数据库的报告采样。

举个热门的例子。如果美国一家大型商业银行想要每小时发布一份报告,寻找城市层面的挤兑的最初迹象,那么nolock查询可以扫描每个城市的现金存取款总和的交易表。对于这样的报告,由回滚更新事务引起的微小百分比的错误不会降低报告的价值。

当你可以接受“脏”数据时使用nolock。这意味着nolock也可以读取正在修改的数据和/或未提交的数据。

在高事务处理环境中使用它通常不是一个好主意,这就是为什么它不是查询的默认选项。

我的2分——当你需要生成报告时,使用WITH (NOLOCK)是有意义的。在这一点上,数据不会有太大的变化&你不会想要锁定这些记录。

简短的回答:

对于有聚集索引的表,只能在SELECT语句中使用WITH (NOLOCK)。

长一点的回答:

WITH(NOLOCK)经常被用作加速数据库读取的神奇方法。

结果集可以包含尚未提交的行,这些行稍后通常会回滚。

如果WITH(NOLOCK)应用于具有非聚集索引的表,那么行索引可以由其他事务更改,因为行数据正在流到结果表中。这意味着结果集可能缺少行或多次显示同一行。

READ COMMITTED增加了一个额外的问题,即多个用户同时更改同一单元格时,单个列内的数据被损坏。