14

我正在 MS SQL Server 上创建一个视图。我对 MS SQL 的接触不多,对 NO LOCK 提示也不是很熟悉。我了解它的作用,但我不知道是否需要在我的情况下使用它。有人问我是否应该包括它,我不知道。

在我用来创建视图的所有查询之后,我是否需要添加 NO HINT?或者这会对用户查询视图本身有什么影响?用户是否应该将 NO LOCK 添加到针对 VIEW 的查询中?

任何关于最佳方法的指导和任何澄清表示赞赏!

4

2 回答 2

12

我先回答你的问题。

最好从外部的视图而不是视图中的表上显示 NOLOCK 提示。

例如

select * from vwTest with (nolock)

或者

set transaction isolation level read uncommitted
select * from vwTest

作为创建者,这样做是为了迎合更广泛的用户群,这些用户群在 SQL 方面的经验可能会也可能不如你自己。通过不在视图中封装 NOLOCK 提示,可以鼓励其他开发人员真正考虑他们希望如何以安全有效的方式检索数据。

现在有更多关于 NOLOCK 的信息。如果您 100% 确定基础数据不再更改,这是一个很好的技巧,一个很好的例子是当 ETL 系统完成当天的数据加载时。它在只读报告系统中也很方便,您再次确定报告运行之间没有数据移动。

否则,不建议在您的系统中使用该提示。如果您不真正了解其含义,则弊大于利。

请参考以下链接了解 NOLOCK 可能导致的损坏: 如果使用 NOLOCK 提示,可能会丢失以前提交的行

于 2013-04-24T02:00:12.757 回答
5

直接来自文档

警告: 因为 SQL Server 查询优化器通常会为查询选择最佳执行计划,所以我们建议只有经验丰富的开发人员和数据库管理员在不得已的情况下才使用提示。

尤其是 NOLOCK 提示是一个臭名昭著的有害和坏主意。它应该只用于特殊情况和特定需求:例如当您不关心返回的数据是否正确时。

于 2013-04-23T22:50:18.153 回答