我知道with(nolock)
和(nolock)
是相同或几乎相同的。 REF:with(nolock) or (nolock) - Is there a difference?
但是nolock
呢?您可以在select
中使用它们中的任何一个,而我看到的唯一显着区别是使用可写的别名时:select * from table1 as mytable with(nolock)
或者select * from table1 as mytable (nolock)
但是你不能写:select * from table1 as mytable nolock
PS :我不是在这里讨论nolock
是好是坏:)
最佳答案
不同之处在于您应该使用语法WITH (NOLOCK)
(或WITH (<any table hint>)
)。为什么?
WITH
。从Table Hints on MSDN:from table1 nolock
根本不应用任何提示-这是一个别名。例如:SELECT nolock.name FROM sys.objects nolock ORDER BY nolock.name;
注意,我可以使用
nolock
作为别名。这里没有任何提示。 from table1 as mytable nolock
在现代版本的SQL Server中是无效的语法。您还应该考虑使用 session 级提示
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
,因为这样您就不会遇到上面的语法问题,并且也不会浪费15个WITH (NOLOCK)
来填充查询。这些使得以后很难用不同的隔离级别替换(例如RCSI,它比READ UNCOMMITTED
IMHO实用得多),而单个批处理级别的语句很容易替换。另外,这对其他读者而言比对OP而言更重要,因此请绝对确保您了解使用
NOLOCK
的风险,其中包括在不存在的单行中获取损坏的数据:关于sql - with(nolock),(nolock),nolock的区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21119880/