eg:select top 200 from 表A with(nolock) where 条件

为了性能,查询时不锁定表,从而达到提高查询速度的目的。

(转)SQL中with(nolock)详解

大家在写查询时,为了性能,往往会在表后面加一个nolock,或者是with(nolock),其目的就是查询是不锁定表,从而达到提高查询速度的目的。

什么是并发访问:同一时间有多个用户访问同一资源,并发用户中如果有用户对资源做了修改,此时就会对其它用户产生某些不利的影响,例如:

   1:脏读,一个用户对一个资源做了修改,此时另外一个用户正好读取了这条被修改的记录,然后,第一个用户放弃修改,数据回到修改之前,这两个不同的结果就是脏读。

  2:不可重复读,一个用户的一个操作是一个事务,这个事务分两次读取同一条记录,如果第一次读取后,有另外用户修改了这个数据,然后第二次读取的数据正好是其它用户修改的数据,这样造成两次读取的记录不同,如果事务中锁定这条记录就可以避免。

   3:幻读,指用户读取一批记录的情况,用户两次查询同一条件的一批记录,第一次查询后,有其它用户对这批数据做了修改,方法可能是修改,删除,新增,第二次查询时,会发现第一次查询的记录条目有的不在第二次查询结果中,或者是第二次查询的条目不在第一次查询的内容中。

   为什么会在查询的表后面加nolock标识?为了避免并发访问产生的不利影响,SQL Server有两种并发访问的控制机制:锁、行版本控制,表后面加nolock是解决并发访问的方案之一。

   1> 锁,每个事务对所依赖的资源会请求不同类型的锁,它可以阻止其他事务以某种可能会导致事务请求锁出错的方式修改资源。当事务不再依赖锁定的资源时,锁将被释放。

   锁的类型:1:表类型:锁定整个表;2:行类型:锁定某个行;3:文件类型:锁定某个数据库文件;4:数据库类型:锁定整个数据库;5:页类型:锁定8K为单位的数据库页。

   锁的分类还有一种分法,就是按用户和数据库对象来分:

   1). 从数据库系统的角度来看:分为独占锁(即排它锁),共享锁和更新锁

   1:共享 (S) :用于不更改或不更新数据的操作(只读操作),一般常见的例如select语句。

  2:更新 (U) :用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。

   3:排它 (X) :用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。

   2). 从程序员的角度看:分为乐观锁和悲观锁。

  1:乐观锁:完全依靠数据库来管理锁的工作。

   2:悲观锁:程序员自己管理数据或对象上的锁处理。

   一般程序员一看到什么锁之类,觉的特别复杂,对专业的DBA当然是入门级知识了。可喜的是程序员不用去设置,控制这些锁,SQLServer通过设置事务的隔离级别自动管理锁的设置和控制。锁管理器通过查询分析器分析待执行的sql语句,来判断语句将会访问哪些资源,进行什么操作,然后结合设定的隔离级别自动分配管理需要用到的锁。

   2>:行版本控制:当启用了基于行版本控制的隔离级别时,数据库引擎 将维护修改的每一行的版本。应用程序可以指定事务使用行版本查看事务或查询开始时存在的数据,而不是使用锁保护所有读取。通过使用行版本控制,读取操作阻止其他事务的可能性将大大降低。也就是相当于针对所有的表在查询时都会加上nolock,同样会产生脏读的现象,但差别在于在一个统一管理的地方。说到了基于行版本控制的隔离级别,这里有必要说下隔离级别的概念。

   隔离级别的用处:控制锁的应用,即什么场景应用什么样的锁机制。

   最终目的:解决并发处理带来的种种问题。

   隔离级别的分类:

   1:未提交读,隔离事务的最低级别,只能保证不读取物理上损坏的数据;

   2:已提交读,数据库引擎的默认级;

   3:可重复读;

   4:可序列化;隔离事务的最高级别,事务之间完全隔离。

   小结:NOLOCK 语句执行时不发出共享锁,允许脏读 ,等于 READ UNCOMMITTED事务隔离级别 。nolock确实在查询时能提高速度,但它并不是没有缺点的,起码它会引起脏读。

   nolock的使用场景(个人观点):

  1:数据量特别大的表,牺牲数据安全性来提升性能是可以考虑的;

   2:允许出现脏读现象的业务逻辑,反之一些数据完整性要求比较严格的场景就不合适了,像金融方面等。

  3:数据不经常修改的表,这样会省于锁定表的时间来大大加快查询速度。

   综上所述,如果在项目中的每个查询的表后面都加nolock,这种做法并不科学,起码特别费时间,不如行版本控制来的直接有效。而且会存在不可预期的技术问题。应该有选择性的挑选最适合的表来放弃共享锁的使用。

   最后说下nolock和with(nolock)的几个小区别:

   1:SQL05中的同义词,只支持with(nolock);

   2:with(nolock)的写法非常容易再指定索引。

跨服务器查询语句时 不能用with (nolock) 只能用nolock

同一个服务器查询时 则with (nolock)和nolock都可以用

比如

SQL code

select * from [IP].a.dbo.table1 with (nolock) 这样会提示用错误select * from a.dbo.table1 with (nolock) 这样就可以

转载于:https://www.cnblogs.com/tianrui/archive/2013/01/15/2860691.html

with(nolock)简解相关推荐

  1. 最新版freetextbox(版本3.1.6)在asp.net 2.0中使用简解

    最新版freetextbox(版本3.1.6)在asp.net 2.0中使用简解 2008-10-14 12:21 简介:对于FreeTextBox(版本3.1.6)在ASP.Net 2.0中使用,只 ...

  2. 最新版FreeTextBox(版本3.1.6)在ASP.Net 2.0中使用简解(提供博客园本地下载)

    来源:cleocn.com 最新版FreeTextBox(版本3.1.6)在ASP.Net 2.0中使用简解(提供博客园本地下载) 简介:对于FreeTextBox(版本3.1.6)在ASP.Net ...

  3. 爬虫5-BeautifulSoup模块简解2

    1.BeautifulSoup简解2 from bs4 import BeautifulSoup import re file = open("./baidu.html",'rb' ...

  4. github-markdown-css 使用简解,markdown文案格式优化(笔记)

    github-markdown-css 使用简解,markdown文案格式优化 1.npm 安装 $ npm install github-markdown-css 2.使用 导入github-mar ...

  5. Cisco AP1240多SSID配置简解

    Cisco AP1240多SSID配置简解 AP1#show run <?xml:namespace prefix = o ns = "urn:schemas-microsoft-co ...

  6. (转)FFMPEG解码H264拼帧简解

    http://blog.csdn.net/ikevin/article/details/7649095 H264的I帧通常 0x00 0x00 0x00 0x01 0x67 开始,到下一个帧头开始之前 ...

  7. 在sqlserver 中with(nolock)详解

    所有Select加 With (NoLock)解决阻塞死锁 在查询语句中使用 NOLOCK 和 READPAST  处理一个数据库死锁的异常时候,其中一个建议就是使用 NOLOCK 或者 READPA ...

  8. SQL with(nolock)详解

    大家在写查询时,为了性能,往往会在表后面加一个nolock,或者是with(nolock),其目的就是查询是不锁定表,从而达到提高查询速度的目的. 什么是并发访问:同一时间有多个用户访问同一资源,并发 ...

  9. QuickSort简解(分治思想) By ACReaper

    快排又称为快速排序算法 快熟排序主要思想为:递归而分,重于分而治,而简与合. 治: int partition(int A[],int st,int ed){int key = A[st];//把第一 ...

最新文章

  1. ios xmlrpc
  2. [转]卓越科技回应所谓的最牛,最受歧视的招聘
  3. 2021 CVPR论文解读征集令
  4. python算闰年和平年的天数_Python自定义函数计算给定日期是该年第几天的方法示例...
  5. Nexus搭建Maven私有仓库
  6. js获取地址栏url以及获取url参数
  7. android注销广播接收器,使用广播接收器 - chuiyuan的个人页面 - OSCHINA - 中文开源技术交流社区...
  8. 使用JavaScript在Canvas上画出一片星空
  9. 开关电源设计从入门到精通(附教程)
  10. 计算机附件中的超级终端,windows10系统中附件中没有超级终端怎么解决
  11. wifi信号衰减与距离关系_wifi无线信号传输衰减距离计算公式
  12. 重型柴油车OBD系统进入逻辑
  13. 传统巨头抢占区块链场景高地 医疗、汽车、金融成为热门赛道
  14. nginx的下载安装配置(Window)
  15. 9.Android 万能ViewHolder
  16. #define ok 1 是什么意思 数据结构书上的
  17. 脉冲时滞微分方程matlab方程
  18. Java程序员,你会选择25k的996还是18k的965?
  19. jsfl批量导出swf
  20. 明解C语言 入门 课后习题练习答案 第二章

热门文章

  1. 分享程序员提升自身能力的7个实用网站
  2. Java:14 个 Spring MVC 顶级技巧,随时用随时爽,一直用一直爽
  3. 盘点关于IDEA的几个调试的实用技巧
  4. 3大原则让你的编程之路越走越顺
  5. mysql 5.7.17源码包_centos7 mysql5.7.17源码安装
  6. 多态的概念、对象上下转型、多态的应用、异常(异常概念、异常分类、java异常处理机制、try...catch...finally、throw和throws、自定义异常)
  7. 进程间通信IPC(一)(半双工管道和消息队列)
  8. Linux系统文件编程(1)
  9. 书呆子rico_寻找设计和类型书呆子的清道夫
  10. 三年经验前端社招——丰巢科技