刚开始工作的时候,经常听同事说在SQL代码的表后面加上WITH(NOLOCK)会好一些,后来仔细研究测试了一下,终于知道为什么了。

那么加与不加到底有什么区别呢?

SQL在每次新建一个查询,就相当于创建了一个会话。在不同的查询窗口操作,会影响到其他会话的查询。当某张表正在写数据时,这时候去查询很可能就会一直处于阻塞状态,哪怕你只是一个很简单的SELECT也会一直等待。

我们这里使用事务来往某张表里写数据,我们知道事务在写完表必须提交(COMMIT)或回滚(ROLLBACK)才能释放表,否则会一直处于阻塞状态。

在插入过程中,我们写一个简单的查询语句,在不添加WITH(NOLOCK)和添加WITH(NOLOCK)的情况下,看会发生什么。

示例数据

如下表A,是我们新建的一个非常简单的表。

下面我们创建一个往里面写数据的事务(使用BEGIN TRAN就可以开始一个事务了)

我们发现有1行受影响了,注意这里的会话ID是59(左上角黄色标签上的数字)

不添加NOLOCK

我们新建一个查询窗口,然后查询A表

从上面的查询可以看到,表A被锁住了,我们的查询一直处于阻塞状态。这里的会话ID是60

这个时候如果你在会话59的窗口执行COMMIT或ROLLBACK,会话60的查询结果会立刻显示出来,这里为了下面的演示我们暂时不提交或回滚。

添加NOLOCK

我们再新建一个查询窗口,还是查询A表,这次我们加上NOLOCK。

注意上图标红色的地方,当前会话ID是55,旁边的60还在执行状态,而我们加了NOLOCK后,瞬间就查询出结果了,而且还把事务里即将要插入的数据给查询到了。这是为什么呢?

事务里的数据虽然还没有提交,但是它实际上已经存在内存里面了,这个时候我们使用NOLOCK查询到的结果,实际上还没存储到硬盘。

从上面的两个测试可以看出,NOLOCK的作用其实就是为了防止查询时被阻塞,只是这样会产生脏读(未提交的数据)。

那么一般什么情况下使用NOLOCK呢?

通常是一些被频繁写的表,不管是插入,更新还是删除。这样的表在查询时,使用NOLOCK是非常有效的。

WITH(NOLOCK)和NOLOCK的区别

不知道小伙伴注意没,我前面介绍时是写的WITH(NOLOCK),但是测试时,使用的是(NOLOCK),它们有什么区别呢?

为了搞清楚WITH(NOLOCK)与NOLOCK的区别,我们先看看下面三个SQL语句有啥区别

SELECT * FROM A NOLOCK
SELECT * FROM A (NOLOCK);
SELECT * FROM A WITH(NOLOCK);
  • (NOLOCK)这样的写法,NOLOCK其实只是别名的作用,而没有任何实质作用。所以不要粗心将(NOLOCK)写成NOLOCK
  • (NOLOCK)与WITH(NOLOCK)其实功能上是一样的。(NOLOCK)只是WITH(NOLOCK)的别名,但是在SQL Server 2008及以后版本中,(NOLOCK)不推荐使用了,"不借助 WITH 关键字指定表提示”的写法已经过时了。
  • 在使用链接服务器的SQL当中,(NOLOCK)不会生效,WITH(NOLOCK)才会生效。
--这样会提示用错误
select * from [IP].[dbname].dbo.tableName  (nolock)
--这样就可以
select * from [IP].[dbname].dbo.tableName with(nolock)

SQL 中为什么经常要加NOLOCK?相关推荐

  1. sql中exec是什么意思_SQL 中为什么经常要加NOLOCK?

    刚开始工作的时候,经常听同事说在SQL代码的表后面加上WITH(NOLOCK)会好一些,后来仔细研究测试了一下,终于知道为什么了. 那么加与不加到底有什么区别呢? SQL在每次新建一个查询,就相当于创 ...

  2. SQL中常用的四个排序函数

    我们在写SQL代码时,只要有排序,首先想到的肯定是ORDER BY,以至于好多小伙伴觉得排序多简单啊. 今天就给大家介绍四个你不怎么常用排序函数,他们就是SQL Server排序中经常用到的ROW_N ...

  3. SQL Server 中as语句后加英文,标点符号等内容

    SQL中as语句后加英文,标点符号等内容 SELECT  isnull(EndTime,getdate()) as '完成时间(H)' FROM [PCMIS].[dbo].[ProcessOfInt ...

  4. 长sql和短sql加java区别_Mybatis下动态sql中##和$$的区别讲解

    一.介绍 mybatis 中使用 Mapper.xml里面的配置进行 sql 查询,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下: select * from user ...

  5. sql中当前日期加2个月_一文搞定Mysql日期时间函数

    总第184篇/张俊红 日期和时间函数部分也是我们日常工作中使用频率比较高的一部分.这一篇我们主要讲讲Mysql里面的日期时间相关的函数,不同数据库之间基本相同,只会有个别函数的差异.大家掌握一个数据库 ...

  6. sql中的模糊查询及字段前加N的作用

    sql语句中在字段前加N: 解决乱码问题 N表示Unicode的含义,不加N时字符串默认采用数据库所采用的定序所对应的字符集,加上N表示字符串采用Unicode ,对于数据库的默认编码方式不确定的情况 ...

  7. 在SQL存储过程中给条件变量加上单引号

    在SQL存储过程中给条件变量加上单引号,不加语句就会出问题,以下就是在存储过程中将条件where设置成了动态变化的,给where赋完值再和前面的语句拼接,再execute(SQL) set @wher ...

  8. Sql中的递归问题-思考与建议

    Sql中的递归问题 [递归] 是一种循环方式或规则 树的遍历常常用到 优点:编写程序方便 缺点:限制与内存,容易崩溃 [描述] 类别表 CID,CName,FID FID=0表示此节点为根节点 如何在 ...

  9. SQL 中left join ,inner join,right join的区别

    2019独角兽企业重金招聘Python工程师标准>>> sql中存在有左连接  插入 右连接 sql语句 left join ,inner join,right join 进行 wh ...

最新文章

  1. php mysql 编程原理_PHP开发的原理及优势介绍
  2. Hazelcast介绍与使用
  3. Java8-Stream-终止操作-查找与匹配
  4. 计算机函数公式一等奖怎么算,信息技术应用 用计算机画函数图象教案设计(一等奖)...
  5. 2019报告:AI程序员人才需求暴涨35倍!每10个公司就有6个人才缺口
  6. 赋能数据智慧,InfoBeat让业务跃动起来
  7. ajax+ashx 完美实现input file上传文件
  8. 《ARM64体系结构编程与实践》开始预订了
  9. 脑虎科技CEO彭雷专访│脑机未来,生命科学的无尽前沿
  10. Murex 快速风险分析引擎
  11. 服务器443端口响应代码,使用443端口远程服务器
  12. 2020年计算机系毕业人数,2020年中国大学生各专业就业报告出炉:计算机类专业月薪最高!...
  13. C语言 命令行 execl函数
  14. U盘量产之更改U盘容量大小
  15. 安装allennlp
  16. 7.STM32C8T6+DHT11在OLED上显示 温度,湿度
  17. office软件合集
  18. 1080p60Hz需要传多少数据,怎么计算显示器带宽(一)【华光昱能知识与您分享】
  19. 银行卡支付的背后原理你了解吗?
  20. Pytorch 中的 torch.optim.swa_utils.AverageModel() 及其原理总结

热门文章

  1. oracle12.2 redo 进程,【Oracle Database 12c新特性】TTnn TMON新的redo传输后台进程
  2. javaweb(04) xml
  3. java向kafka推送数据_Java编写程序将数据存入Kafka中
  4. python状态码及其含义_Shell退出状态码及其应用详解
  5. 1.7_heap_sort_堆的向下调整堆排序
  6. git ssh配置文件 服务器_【GIT】日常开发中的这些Git技巧你知道吗?
  7. python中存储坐标_最好使用元组或numpy数组来存储坐标
  8. 售票系统的组件图和部署图_实物图+电气图讲解:教你学会看配电系统图,值得收藏!...
  9. lua协程 unity_unity协程coroutine浅析
  10. python批量修改文件名_python实现批量改文件名称的方法