commit|SQL中为什么经常要加NOLOCK?
本文插图
作者:丶平凡世界
来源: SQL数据库开发
刚开始工作的时候 , 经常听同事说在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* FROMA NOLOCKSELECT * FROMA (NOLOCK)SELECT* FROMA 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) 【来源:CDA数据分析师】
声明:转载此文是出于传递更多信息之目的 。 若有来源标注错误或侵犯了您的合法权益 , 请作者持权属证明与本网联系 , 我们将及时更正、删除 , 谢谢 。邮箱地址:newmedia@xxcb.cn
【commit|SQL中为什么经常要加NOLOCK?】
推荐阅读
- 苹果蛋挞,香甜中淡淡的酸,香酥诱人!
- 初中生物|干货|初中生物:不得不记的50个核心概念,初一初二赶紧收藏!
- 猴面包树|这种树“能吃能喝还能住”,养活无数非洲人,引进中国后画风变了
- 三星堆遗址|直击三星堆发布会|雷雨:四号坑灰烬中发现纺织品痕迹
- 云南|云南昭通市威信县发生3.3级地震
- 肝癌|深度总结|慢乙肝抗病毒治疗中发生肝癌的风险预测模型
- 钱学森|钱学森侄子,拿下诺奖后为何说:我不是中国人,我在美国长大
- 冰岛|数万次地震之后 冰岛一火山爆发
- 恐龙|恐龙也怕患癌症?新发现,科学家在恐龙化石中检测出恶性肿瘤痕迹
- 昆虫|近亿年前的虫珀里藏只“小怪兽”!中国科学家发现昆虫新物种
