首页 > 数据库 >SQL 中为什么经常要加NOLOCK?

SQL 中为什么经常要加NOLOCK?

时间:2024-06-18 10:26:05浏览次数:23  
标签:要加 查询 会话 NOLOCK SQL 我们 SELECT

刚开始工作的时候,经常听同事说在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 with (nolock)
--这样就可以
select * from [dbname].dbo.tableName with(nolock)

标签:要加,查询,会话,NOLOCK,SQL,我们,SELECT
From: https://www.cnblogs.com/chewen/p/18253793

相关文章

  • OceanBase中OCP平台显示的TOPSQL模块是如何查询出来的
    说明:oba脚本通过变量的方式直接实现以下三个查询,如手工查询需要分别执行SQL获取对应的变量信息1.server_id检查方式selecta.idserver_id,a.svr_ip,a.zone,b.primary_zone,b.tenant_namefrom__all_servera,__all_tenantbwheretenant_id=1001orderby3;2.计算总cpu--这......
  • Navicat和SQLynx功能比较三(数据导出:使用MySQL近千万数据测试)
    数据导出的功能在数据库管理工具中是最普遍的功能之一。所以数据导出的功能稳定性和性能也是数据库管理工具是否能很好地满足应用需求的一个考虑因素。目录1.整体比较2.示例2.1 前置环境2.2Navicat导出2.3 SQLynx导出2.4 性能对比结果(690万行数据)3.结论Nav......
  • MySQL之复制(二)
    复制配置复制为MySQL服务器配置复制非常简单。但由于场景不同,基本的步骤还是有所差异的。最基本的场景是新安装的主库和备库,总的来说分为以下几步:1.在每台服务器上创建复制账号2.配置主库和备库3.通知备库连接到主库并从主库复制数据这里我们假定大部分配置采用默认值......
  • NoSQLBooster for MongoDB延长-试用期
    mongo的客户端较少,其中NosqlBoosterForMongo算是一个不错的客户端软件,但是他也不是免费的,试用期只有30天。好在这个软件是基于nodejs的。所以我们可以利用npm对这个应用进行解包串改源码,将源码中设置试用期的参数改成足够大,然后再封包,这样我们就能不断的白嫖了。      ......
  • 【MySQL基础随缘更系列】DCL语句
    文章目录一、DCL概述1.1、什么是DCL1.2、为什么学习DCL二、用户管理2.1、查看用户2.2、创建用户2.3、删除用户三、密码管理3.1、修改用户密码3.2、设置管理员(root)密码四、权限管理4.1、查看用户权限4.2、授权4.3、撤销授权......
  • 【MySQL基础随缘更系列】AB复制
    文章目录mysqlAB复制实战一、mysqlAB复制二、AB复制原理三、master服务器设置3.1、安装mysql并启动3.2、关闭防火墙,selinux3.3、设置时间服务器3.4、修改配置文件设置server-id=N3.5、创建slave连接master的账号,用于取SQL语句四、slave设置4.3、修改配置文件设置s......
  • mysql一课一得
    自从我开始深入学习MySQL数据库管理系统以来,我深感其强大与深邃。MySQL作为一个开源的关系型数据库管理系统,不仅广泛应用于各种Web开发场景,还为企业级应用提供了稳定可靠的数据存储和查询服务。以下是我学习MySQL过程中的一些心得体会。大数据量下的性能问题等。这些挑战让我更......
  • SQL 入门教程:从基础到实践
    前言SQL(StructuredQueryLanguage)是一种用于管理和操作关系型数据库的标准语言。无论你是测试工程师、开发人员,还是数据分析师,掌握SQL都能帮助你更高效地工作。本文将详细介绍SQL的基本概念、常用语法和实践操作,帮助初学者快速入门。什么是SQL?SQL是一种标准化的语言,用......
  • MySQL约束详解:构建数据完整性基石
    目录MySQL约束1.1约束1.1数据类型1.2主键约束[`重要`]1.3自增约束1.4唯一约束1.5非空约束1.6默认值代码演示1.7外键约束[了解]思维导图最后MySQL约束MySQL作为广泛使用的开源关系型数据库管理系统,其强大的数据约束功能对于维护数据的一致性和准确性至关重......
  • mysql手册
    查看mysql的配置文件位置mysql--help|grep"Defaultoptions"-C1输出如下,可知mysql读取默认选项的位置修改mysqlcmd提示符修改提示符有两种方法配置文件通常在~/.my.cnf中配置prompt命令在mysqlcmd中使用prompt[text]设置提示符格式对于不是控制字符的字符,......