阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

你知道SQL 中为什么经常要加Nolock?

46次阅读
没有评论

共计 1459 个字符,预计需要花费 4 分钟才能阅读完成。

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

你知道 SQL 中为什么经常要加 Nolock?

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

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

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

示例数据

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

你知道 SQL 中为什么经常要加 Nolock?

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

你知道 SQL 中为什么经常要加 Nolock?

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

不添加 NOLOCK

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

你知道 SQL 中为什么经常要加 Nolock?

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

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

添加 NOLOCK

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

你知道 SQL 中为什么经常要加 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)

    阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

    腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

    代金券:在阿里云专用满减优惠券

    正文完
    星哥说事-微信公众号
    post-qrcode
     0
    星锅
    版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计1459字。
    转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
    【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
    阿里云-最新活动爆款每日限量供应
    评论(没有评论)
    验证码
    【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中