为什么NOLOCK查询提示是个不明智的想法
一些人总当NOLOCK查询提示是SQL Server里的加速器,因为它避免了大量的死锁情景。在这篇文章里,我想向你展示下为什么NOLOCK查询提示是个不好的想法。
脏读(Dirty Reads)
NOLOCK查询提示一个最大的副作用就是在你的记录集会出现所谓的脏读这个事实。我们来看下面的代码:
BEGIN TRANSACTION UPDATE Person.Person
SET FirstName = 'James'
WHERE LastName = 'Jones'
如你所见,我开始了一个新的事务,对AdventureWorks2012数据库里的Person.Person表进行UPDATE语句。现在当你尝试同时在另一个会话里读取这个记录时,这个SELECT语句会阻塞——在这个情况下请求的共享锁(S)会被已经授予的排它锁(X)阻塞——写阻塞读操作。
SELECT
FirstName,
LastName
FROM Person.Person
WHERE LastName = 'Jones'
GO
一些人现在回应用SQL Server里的加速器,使用NOLOCK查询提示:
SELECT
FirstName,
LastName
FROM Person.Person WITH (NOLOCK) -- It's a kind of magic...
WHERE LastName = 'Jones'
GO
如你所见死锁情景马上解决了,你从SQL Server返回记录了——遗憾的是在你面前现在有脏读(Dirty Read):你读取了尚未提交的数据。假设现在用UPDATE语句的第1个事务回滚了:在这个情况下,你已读取的数据在SQL Server里逻辑上是从未存在的。
因此NOLOCK查询提示并不是在每个情景都是有用的。 如果你想运行一个报表,或者你只想快速返回结果,记录不用100%正确,这“可以是”个可取的(考虑下一天的平均销售额)。当然,当你需要精确的结果,NOLOCK并不可取。当然也有一些特定场景即使NOLOCK也会阻塞。
读提交快照隔离(Read Committed Snapshot Isolation (RCSI))
有人给我提了为什么NOLOCK查询提示基本是一个不方便的(no-go)的选择:你不能在明显的方式里切换你的数据库查询到读提交快照隔离(Read Committed Snapshot Isolation (RCSI))。我从未想过这个情景,但没错是对的。读提交快照隔离(Read Committed Snapshot Isolation (RCSI))是个数据库选项。当你启用它的时候,每个查询都是在新的读提交快照乐观隔离级别里——只要在你的事务里不指定任何隔离级别。
对于特定的SQL语句使用NOLOCK查询提示,你临时修改隔离级别为未提交读(Read Uncommitted)。因此SQL语句也不会从读提交快照隔离受益,因为语句并没有在默认的提交读( Read Committed)隔离运行。这就对了!当你下次写下神奇的……WITH(NOLOCK)……时,好好想下这个额外参数。
小结
使用NOLOCK查询提示运行每个查询并不都有意义。一方面你会通过脏读(Dirty Reads)返回不一致的数据。另一方面你不能从读提交快照隔离(Read Committed Snapshot Isolation (RCSI))乐观隔离级别里受益,因为你临时修改了你SQL语句的默认隔离级别。
感谢关注!
参考文章:
https://www.sqlpassion.at/archive/2015/06/15/why-the-query-hint-nolock-is-a-bad-idea/
为什么NOLOCK查询提示是个不明智的想法的更多相关文章
- EntityFramework Core 3.x添加查询提示(NOLOCK)
前言 前几天看到有园友写了一篇关于添加NOLOCK查询提示的博文<https://www.cnblogs.com/weihanli/p/12623934.html>,这里呢,我将介绍另外一 ...
- sql 优化 链接提示 查询提示 标提示
SQL Server的查询优化器在select查询执行的时候产生一个高效的查询执行计划.如果优化器不能选择最优的计划,那么就需要检查查询计划.统计信息.支持的索引等,而通过使用提示可以改变优化器选择查 ...
- Sql Server优化之索引提示----我们为什么需要查询提示,Sql Server默认情况下优化策略选择的不足
环境: Sql Server2012 SP3企业版,Windows Server2008 标准版 问题由来: 最近在做DB优化的时候,发现一个存储过程有非常严重的性能问题, 由于整个SP整体逻辑是一个 ...
- SQL Server调优系列玩转篇(如何利用查询提示(Hint)引导语句运行)
前言 前面几篇我们分析了关于SQL Server关于性能调优的一系列内容,我把它分为两个模块. 第一个模块注重基础内容的掌握,共分7篇文章完成,内容涵盖一系列基础运算算法,详细分析了如何查看执行计划. ...
- 利用查询提示优化SQL
数据库环境:SQL SERVER 2005 我们来看一下SQL语句及对应的数据量 SELECT COUNT(*) FROM cinvout_02 a WHERE ( a.dept_id IN ( SE ...
- MySQL查询提示
MySQL查询提示: 1.LOW_PROPRITY,HIGHT_PRIORITY 作用:指定sql语句的运行优先级,会将加了HIGHT_PROPRITY提示的sql调度到表访问队列的最前面 限制:仅对 ...
- MySQL自成一派的查询提示
[查询提示] MySQL中可以给select语句各种提示,比如告诉它“查询的结果集特别大,请直接用磁盘临时表”,“请让这条select优先执行” .... [查询提示:与结果集相关] 与结果集相关的查 ...
- SQL Server 调优系列玩转篇一(如何利用查询提示(Hint)引导语句运行)
前言 前面几篇我们分析了关于SQL Server关于性能调优的一系列内容,我把它分为两个模块. 第一个模块注重基础内容的掌握,共分7篇文章完成,内容涵盖一系列基础运算算法,详细分析了如何查看执行计划. ...
- ECSHOP后台SQL查询提示错误 this sql May contain UPDATE,DELETE,TRUNCATE,ALTER,DROP,FLUSH,INSERT
一).首先说一下错误现象:市面上流行的绝大部分ECSHOP模板,安装的时候都需要执行一段或几段SQL语句来修改数据结构或者初始化一些数据.大多数ECSHOP管理员为了省事,都会通过 “ECSHOP后台 ...
随机推荐
- asp.net 读取RedisSessionStateProvider配置
最近项目遇到需要读取RedisSessionStateProvider配置文件applicationName节点,如: 读取的方法有很多: 1直接读取web.config文件, void test1( ...
- mac电脑如何不生成.DS_STORE文件
执行这个命令,然后重启 defaults write com.apple.desktopservices DSDontWriteNetworkStores true
- db2 表授权语句
grant insert/update/delete on table schema.table_name to user user_name;
- 如何评价微软Connect 2015?[转载]
全部的新闻和公告在这里:News and Announcements at Connect(); //2015微博话题:Sina Visitor System根据题主的理解大致地总结一下……1. Vi ...
- JAVA中类、实例与Class对象
已同步更新至个人blog:http://dxjia.cn/2015/08/java-class-object/ 类 类是面向对象编程语言的一个重要概念,它是对一项事物的抽象概括,可以包含该事物的一些属 ...
- Fixed error when submitting assignments in Machine Learning on Coursera
Environment: OS: OSX 10.8.5 Matlab: R2013a(8.1.0.604) 64bit How to fix: In file submit.m, line 129 ...
- Pro ASP.NET MVC –第五章 使用Razor
Razor是微软在MVC3中引入的视图引擎的名字,在MVC4中对其进行了改进(尽管改动非常小).视图引擎处理ASP.NET内容.寻找指令,典型地用于插入动态数据并输出到浏览器中.微软维持了两个视图引擎 ...
- 使用WebApi时Post和Put的区别
简单的说Post是添加,Put是修改 吃不准的话,尝试用相同参数访问二次接口,结果不同的是Post(会产生多条记录),结果相同的是Put(仅为一条记录),例如:写博客就是Post:更新签名就是Put
- ux.form.field.KindEditor 所见所得编辑器
注意需要引入KindEditor相关资源 //所见所得编辑器 Ext.define('ux.form.field.KindEditor', { extend: 'Ext.form.field.Text ...
- haproxy 配置
1.环境: 操作系统:CentOS 6.4 haproxy: 1.3.15.10 [下载:http://download.chinaunix.net/download.php?id=25784& ...