首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sql中nolock的语法

sql中nolock的语法
EN

Stack Overflow用户
提问于 2009-11-13 01:21:55
回答 5查看 80.4K关注 0票数 20

我见过使用nolock和with(nolock)的sql语句,例如-

代码语言:javascript
复制
select * from table1 nolock where column1 > 10

代码语言:javascript
复制
select * from table1 with(nolock) where column1 > 10

以上哪一项陈述是正确的?为什么?

EN

回答 5

Stack Overflow用户

发布于 2009-11-13 01:37:15

第一条语句没有锁定任何内容,而第二条语句锁定了任何内容。当我刚刚在SQL Server 2005上进行测试时,在

代码语言:javascript
复制
select * from table1 nolock where column1 > 10 --INCORRECT

在该查询中,"nolock“成为table1的别名。

代码语言:javascript
复制
select * from table1 with(nolock) where column1 > 10

执行所需的nolock功能。持怀疑态度?在单独的窗口中,运行

代码语言:javascript
复制
BEGIN TRANSACTION
UPDATE tabl1
 set SomeColumn = 'x' + SomeColumn

来锁定表,然后在各自的窗口中尝试每条锁定语句。第一个将挂起,等待锁被释放,第二个将立即运行(并显示“脏数据”)。别忘了发布

代码语言:javascript
复制
ROLLBACK

当你完成的时候。

票数 31
EN

Stack Overflow用户

发布于 2009-11-13 02:01:04

不推荐使用的功能列表位于Deprecated Database Engine Features in SQL Server 2008

  • 在UPDATE或DELETE语句的FROM子句中指定NOLOCK或READUNCOMMITTED。不使用WITH关键字指定表提示的
  • 。不带空格的
  • HOLDLOCK表提示作为表提示之间的分隔符。
  • 通过视图间接应用表提示以调用多语句表值函数(TVF)。

它们都在下一版SQL之后有时会被删除的特性列表中,这意味着只有在较低的数据库兼容级别下才能在enxt版本中支持它们。

话虽如此,我对这个问题的看法是这样的:

  • from table nolockfrom table with(nolock)都是错的。如果你需要脏读,你应该使用适当的transaction isolation级别:set transaction isolation level read uncommitted。通过这种方式,使用的立法级别被明确地声明并从一个“旋钮”控制,而不是通过源散布,并受制于表提示的所有怪癖(通过视图和TVF等间接应用)。
  • Dirty reads是一种简化。在99.99%的情况下,需要的是减少争用,而不是读取未提交的数据。通过针对设计良好的模式编写适当的查询,并在必要时部署快照隔离,可以减少争用。最好的解决方案,几乎总是解决一些极端的情况,是在数据库中使用enable read commited snapshot,让引擎发挥它的魔力:

ALTER DATABASE MyDatabase SET ALLOW_SNAPSHOT_ISOLATION ON

ALTER DATABASE MyDatabase SET READ_COMMITTED_SNAPSHOT ON

然后删除selects中的所有提示。

票数 18
EN

Stack Overflow用户

发布于 2009-11-13 01:23:45

它们在技术上都是正确的,但是从SQL2005开始,所以习惯使用not using the WITH keyword has been deprecated关键字--简短的回答,使用WITH关键字。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1723910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档