【发布时间】: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 UNCOMMMITTED和NOLOCK是新手的标志。 -
除非我没有设计数据库。可能只是在我之前的每个人都只是在不了解它做了什么的情况下对所有事情都设置了 NO LOCK。这就是为什么我要问什么是正确的做法。感谢大家的帮助,我不会将 NO LOCK 放在我的基础查询上,因为我认为这些用户不会以数据在查看时会发生变化的方式使用视图,但我会确认那个。
-
就其价值而言——我不同意 NOLOCK 是不知道自己在做什么的人的标志。我认识的一些最敏锐的 DBA 经常使用它——当然是在正确的地方。多年来,我遇到了很多情况,如果我可以避免使关键表脱机(例如,如果我的聚合查询升级为表锁),我很容易接受一些错误计数的记录的权衡。这当然不是每一种情况,但我经常遇到这种情况,我相信这种笼统的陈述并不是很有帮助。
标签: sql-server tsql view