【问题标题】:Do I need NO LOCK in my CREATE View query我的 CREATE View 查询中是否需要 NO LOCK
【发布时间】:2013-04-17 07:30:15
【问题描述】:

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

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

感谢任何关于最佳方法的指导和任何澄清!

【问题讨论】:

  • 正确设计您的数据库及其查询,这样您就不需要WITH (NOLOCK)。我向你保证,你并不真正想要脏读——你为什么要允许获得甚至从未存在于数据库中的幻象行的可能性?最好的方法是仔细工作,以尽量减少任何类型的锁在行上持有的时间——包括读锁。这意味着正确的表和索引设计,以及应用程序中一致的更新/插入/删除模式。随意使用SET TRANSACTION ISOLATION LEVEL READ UNCOMMMITTEDNOLOCK 是新手的标志。
  • 除非我没有设计数据库。可能只是在我之前的每个人都只是在不了解它做了什么的情况下对所有事情都设置了 NO LOCK。这就是为什么我要问什么是正确的做法。感谢大家的帮助,我不会将 NO LOCK 放在我的基础查询上,因为我认为这些用户不会以数据在查看时会发生变化的方式使用视图,但我会确认那个。
  • 就其价值而言——我不同意 NOLOCK 是不知道自己在做什么的人的标志。我认识的一些最敏锐的 DBA 经常使用它——当然是在正确的地方。多年来,我遇到了很多情况,如果我可以避免使关键表脱机(例如,如果我的聚合查询升级为表锁),我很容易接受一些错误计数的记录的权衡。这当然不是每一种情况,但我经常遇到这种情况,我相信这种笼统的陈述并不是很有帮助。

标签: sql-server tsql view


【解决方案1】:

我会先回答你的问题。

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

例如

select * from vwTest with (nolock)

set transaction isolation level read uncommitted
select * from vwTest

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

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

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

请参考以下链接了解 NOLOCK 可能造成的损坏: Previously committed rows might be missed if NOLOCK hint is used

【讨论】:

  • 感谢您回答我的具体问题并提供更多信息。我将继续了解更多关于 NOLOCK 和一般提示的信息。
【解决方案2】:

直接来自Doc

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多