博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sql server 使用nolock提升性能
阅读量:5038 次
发布时间:2019-06-12

本文共 1018 字,大约阅读时间需要 3 分钟。

博客园有许多关于nolock的文章,大部分都写得很好,例如:

这里仅结合个人项目,作为个人笔记记录。

nolock 的使用方法如:

select * from table1 with(nolock)

with 后面加“锁定提示”,具体的锁定提示有许多种,有表级别,页级别,行级别等等。具体可以参照上面的链接。

nolock 是锁定级别是:不采用任何锁。在允许脏读的情况下,使用nolock可以提升查询性能避免锁定数据。关键词就是加粗部分了。

脏读的意思是:读取了其它事务中未提交的数据,但该事务可能被回滚。

首先要明确的是,sql server 对于 insert/update/delete 都会加上排它锁,也就是在这几个操作进行时,其它的操作都必须进行等待。而对于select会加上共享锁,也就是在读取时,其它操作只能进行读取。看一个简单的测试,新建两个查询窗口,sql如下:

--查询窗口一begin tranupdate test set c = '2' where id = 2--查询窗口二select * from test where id = 2

当查询窗口一的事务没有提交时,其它查询是无法读取的。这是sql server 的默认隔离级别,保证了不会出现脏读。接着我们用 nolock 来测试,查询窗口二的sql改为:

--查询窗口二select * from test with(nolock) where id = 2

可以看到,即使查询窗口一的事务没有提交,数据依然可以被读取出来。那什么时候出现脏读呢?很简单,当事务rollback时,就读取到脏数据了。

对于一些对数据要求严格的系统,脏读是不可接受的,那么nolock 也就不能使用。但许多时候,我们的查询是可以允许脏读的,因为它带来许多好处。

1. 提升查询性能

    从上面的例子可以看到,nolock不受锁的影响,这表示它可以直接读取数据,而不用等到锁释放。

2. 避免锁定数据

    这个好处从上面的链接可以理解得更好。有时候我们的 select 可能也是耗时的,上面说到,select会加上共享锁,也就是select的时候,其它事务例如update是无法进行的,如果我们的select执行太久,那么其它操作就可能会因为超时而执行失败。

转载于:https://www.cnblogs.com/4littleProgrammer/p/4755582.html

你可能感兴趣的文章
【Spring】Spring系列7之Spring整合MVC框架
查看>>
POJ2195&&HDU1533(KB11-D 最小费用最大流)
查看>>
symfony2 表单
查看>>
微信小程序调用后台接口+热点新闻滚动展示
查看>>
【实例解析】某水泥企业应用商业智能提升管理效率
查看>>
如何利用自定义函数把阳历转换成阴历
查看>>
declare和typeset DEMO
查看>>
three.js 性能优化的几种方法
查看>>
《梦断代码》读书笔记(三)
查看>>
FreeMarker解析json数据
查看>>
Java8 Lambda表达应用 -- 单线程游戏server+异步数据库操作
查看>>
次序+“选择不重复的记录”(3)——最大记录
查看>>
Codeforces 450 C. Jzzhu and Chocolate
查看>>
[Unity3D]Unity3D游戏开发MatchTarget的作用攀登效果实现
查看>>
ACdream 1115 Salmon And Cat (找规律&&打表)
查看>>
MFC中CString.Format的详细用法
查看>>
JSON、JSONP、Ajax的区别
查看>>
AngularJS学习篇(一)
查看>>
【转载】 IP实时传输协议RTP/RTCP详解
查看>>
关于Xshell无法连接centos6.4的问题
查看>>