With(ReadPast)就不会被阻塞吗?
在生产环境中,会有很多使用ReadPast查询提示的场合,来避免正在被其它事务锁定的行对当前查询造成阻塞,而又不会获取到“脏数据”。
可是很多人都疑惑,为什么我使用了ReadPast仍然有时会被阻塞?
首先我们找到联机帮助:
READPAST
指定数据库引擎不读取由其他事务锁定的行。 如果指定了 READPAST,将跳过行级锁。 也就是说,数据库引擎将跳过这些行,而不是阻塞当前事务直到锁被释放。 例如,假设表 T1 包含一个单精度整数列,其值为 1、2、3、4 和 5。 如果事务 A 将值 3 更改为 8,但尚未提交,则 SELECT * FROM T1 (READPAST) 将生成值 1、2、4 和 5。 使用 SQL Server 表实现工作队列时,READPAST 主要用于减少锁定争用。 使用 READPAST 的队列读取器会跳过被其他事务锁定的队列项,跳至下一个可用的队列项,而不是等待其他事务释放锁。
一切看起来都很美好,但是请看如下场景:
表名[IP],聚集索引字段:BIP
会话一:
BEGIN TRAN
SELECT * FROM ip WITH(XLOCK) WHERE BIP='1.10.8.0'
然后去会话二,执行:
SELECT * FROM ip WITH(READPAST)
发现会话二被阻塞了

Why?
我们通过系统视图sys.dm_tran_locks来看看发生了什么:
SELECT request_session_id, resource_type,
request_status, request_mode,
resource_description, object_name(p.object_id) as object_name,p.index_id
FROM sys.dm_tran_locks left join sys.partitions p
on sys.dm_tran_locks.resource_associated_entity_id = p.hobt_id

上图中可以看到,会话二(ID61)中的select妄图获取page(1:23952)上的S共享锁,却被会话一(ID56)在该page上的IX意向排它锁给拦住了
为什么?说好的会跳过其它事务锁定的行呢?
“等等,你刚才说的最后一个字是什么?”
“呢”?
“不是,再上一个!“
”行“?
”对了!“
指定数据库引擎不读取由其他事务锁定的行。 如果指定了 READPAST,将跳过行级锁。
在会话二中,我们使用了select * ,并且没有where条件,执行计划会使用聚集索引扫描:

扫描意味着什么?在每个扫描过的page上都会加S共享锁!!

而,如果指定where条件,并且执行计划是聚集索引查找的话,则只会在所查找的页面上获取IS意向共享锁!
(该查询返回空结果集)


知道了以上区别,我们再来看看SQLServer锁兼容图表:


再来回想一下整个过程,在会话一中,我们使用XLOCK提示,使得SQLServer获取了一个Page上的意向排它锁IX,并且保持事务。
在会话二中我们使用了聚集索引扫描的查询计划,使得在每一个页面上都会申请S共享锁,从上面的图红圈处可见,S是与IX互斥的,故该查询会被阻塞,而指定了where条件的查询,申请的是page上的IS意向共享锁,上面图绿圈处可见,IS与IX是不冲突的,故不会被阻塞。
说到这里,我有想起了锁提示ROWLOCK,联机丛书解释如下:
ROWLOCK
指定通常采用页锁或表锁时,采用行锁。 在从 SNAPSHOT 隔离级别操作的事务中指定时,除非将 ROWLOCK 与需要锁的其他表提示(例如,UPDLOCK 和 HOLDLOCK)组合,否则不会取得行锁。
听这解释,貌似可以解决我们上面说的阻塞的问题啊,那让我们来试一下:
SELECT * FROM ip WITH(ROWLOCK)
果然可以!!

总结:
SQLServer每个阻塞都是有原因的,瞬间的、少量的阻塞并不是不可原谅的,在高并发的系统中都是正常的,但是频繁的,长时间的阻塞(个人认为200ms以上都是值得注意的),就应该引起DBA的重视,搞清楚原因是什么。阻塞源没有尽快完成事务的原因多种多样,可能是事务内的的语句效率问题,可能是程序端调用时出现了交互或者中途错误、可能是数据库服务器系统资源出了问题。
总之,DBA会一直和阻塞、死锁做着长期的、不懈的斗争。。。。。
With(ReadPast)就不会被阻塞吗?的更多相关文章
- SQL with(unlock)与with(readpast) (转)
所有Select加 With (NoLock)解决阻塞死锁,在查询语句中使用 NOLOCK 和 READPAST 处理一个数据库死锁的异常时候,其中一个建议就是使用 NOLOCK 或者 READPAS ...
- SQL Server-聚焦NOLOCK、UPDLOCK、HOLDLOCK、READPAST你弄懂多少?(三十四)
前言 时间流逝比较快,博主也在快马加鞭学习SQL Server,下班回来再晚也不忘记更新下博客,时间挤挤总会有的,现在的努力求的是未来所谓的安稳,每学一门为的是深度而不是广度,求的是知识自成体系而不是 ...
- 探讨SQL Server并发处理队列数据不阻塞解决方案
前言 之前对于并发这一块确实接触的比较少,自从遇到现在的老大,每写完一块老大都会过目一下然后给出意见,期间确实收获不少,接下来有几篇会来讲解SQL Server中关于并发这一块的内容,有的是总结,有的 ...
- SQL with(unlock)与with(readpast)
所有Select加 With (NoLock)解决阻塞死锁,在查询语句中使用 NOLOCK 和 READPAST 处理一个数据库死锁的异常时候,其中一个建议就是使用 NOLOCK 或者 READPAS ...
- 简述SQL with(unlock)与with(readpast)
所有Select加 With (NoLock)解决阻塞死锁,在查询语句中使用 NOLOCK 和 READPAST 处理一个数据库死锁的异常时候,其中一个建议就是使用 NOLOCK 或者 READPAS ...
- SQL SERVER中UPDLOCK ,READPAST使用
原文:SQL SERVER中UPDLOCK ,READPAST使用 SQL SERVER中中获取不重复数据: select top 1 * from orders with(UPDLOCK ,READ ...
- SqlServer中的更新锁(UPDLOCK和READPAST)
UPDLOCK和READPAST,通过UPDLOCK和READPAST的结合我们能够解决许多问题,比如我当前项目中对于更新预约人数,则用到了UPDLOCK和READPAST,因为考虑到并发如果固定预约 ...
- 探真无阻塞加载javascript脚本技术,我们会发现很多意想不到的秘密
下面的图片是我使用firefox和chrome浏览百度首页时候记录的http请求 下面是firefox: 下面是chrome: 在浏览百度首页前我都将浏览器的缓存全部清理掉,让这个场景最接近第一次访问 ...
- 高性能Javascript--脚本的无阻塞加载策略
Javascript在浏览器中的性能,可以说是前端开发者所要面对的最重要的可用性问题. 在Yahoo的Yslow23条规则当中,其中一条是将JS放在底部 .原因是,事实上,大多数浏览器使用单进程处理U ...
随机推荐
- scanf()中清除输入缓冲区的几种方法归纳
应用场景:我们使用多个scanf()的时候,如果输入缓冲区还有数据的话,那么scanf()就不会询问用户输入,而是直接就将输入缓冲区的内容拿出来用了,这就导致了前面的错误影响到后面的内容,为了隔离这种 ...
- 如何正确使用日志Log
title: 如何正确使用日志Log date: 2015-01-08 12:54:46 categories: [Python] tags: [Python,log] --- 文章首发地址:http ...
- PowerDesigner-VBSrcipt-自动设置主键,外键名等(SQL Server)
在PowerDesigner中的设计SQL Server 数据表时,要求通过vbScript脚本实现下面的功能: 主键:pk_TableName 外键:fk_TableName_ForeignKeyC ...
- WebApi - 路由
这段时间的博客打算和大家一起分享下webapi的使用和心得,主要原因是群里面有朋友说希望能有这方面的文章分享,随便自己也再回顾下:后面将会和大家分不同篇章来分享交流心得,希望各位多多扫码支持和点赞,谢 ...
- 谱聚类(spectral clustering)原理总结
谱聚类(spectral clustering)是广泛使用的聚类算法,比起传统的K-Means算法,谱聚类对数据分布的适应性更强,聚类效果也很优秀,同时聚类的计算量也小很多,更加难能可贵的是实现起来也 ...
- 修改eclipse皮肤
习惯了vim黑色背景的程序猿们想必用eclipse时会倍感的不适应吧,不过没关系,因为eclipse的皮肤是可以自己定制的! 下面是我电脑上的eclipse界面,看到这个是不是找回了vim的感觉呢? ...
- PHP中PDO事务的使用方法
事务 (Transaction) 是操作数据库中很重要的一个功能, 它可以让你预定一条, 或者一系列 SQL 语句, 然后一起执行. 在执行的过程中, 如果其中的某条执行失败, 可以回滚所有已更改的操 ...
- 浏览器的兼容模式下的button中文字垂直方向不居中显示
<button style="cursor:pointer;vertical-align: middle;" >删除</button> 这时候垂直不居中. ...
- GSD_WeiXin(高仿微信)应用源码
高仿微信计划:已经实现功能 1.微信首页(cell侧滑编辑.下拉眼睛动画.下拉拍短视频.点击进入聊天详情界面) 2.通讯录(联系人字母排序.搜索界面) 3.发现(朋友圈) 4.我(界面) 待实现功能( ...
- EntityFramework 6 + Mysql 生成POCOs
问题 使用EDMX文件 EF Power Tools参数不正确的解决方法 对于"异常来自 HRESULT:0x80070057 (E_INVALIDARG)",有方法说" ...