深入浅出解析mssql在高频,高并发访问时键查找死锁问题

深入浅出解析mssql在高频,高并发访问时键查找死锁问题

        SQL Server死锁使我们经常遇到的问题,数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁。希望对您学习SQL
Server死锁方面能有所帮助。

        死锁对于DBA或是数据库开发人员而言并不陌生,它的引发多种多样,一般而言,数据库应用的开发者在设计时都会有一定的考量进而尽量避免死锁的产生.但有时因为一些特殊应用场景如高频查询,高并发查询下由于数据库设计的潜在问题,一些不易捕捉的死锁可能出现从而影响业务.这里为大家介绍由于设计问题引起的键查找死锁及相关的解决办法.

        这里我们在测试的同时开启trace profiler跟踪死锁视图(locks:deadlock graph).(当然也可以开启跟踪标记,或者应用扩展事件(xevents)等捕捉死锁)

        创建测试对象code:

create table testklup
(
clskey int not null,
nlskey int not null,
cont1 int not null,
cont2 char(3000)
)

create unique clustered index inx_cls on testklup(clskey)

create unique nonclustered index inx_nlcs on testklup(nlskey) include(cont1)

insert into testklup select 1,1,100,'aaa'
insert into testklup select 2,2,200,'bbb'
insert into testklup select 3,3,300,'ccc'

        开启会话1 模拟高频update操作

        ----模拟高频update操作

declare @i int
set @i=100
while 1=1
 begin
 update testklup set cont1=@i
 where clskey=1
 set @i=@i+1
 end

        开启会话2 模拟高频select操作

        ----模拟高频select操作

declare @cont2 char(3000)
while 1=1
begin
  select @cont2=cont2 from testklup where nlskey=1
end

 
      此时开启会话2执行一小段时间时我们就可以看到类似错误信息:图1-1

图1-1

        而在我们开启的跟踪中捕捉到了如下的死锁图.图1-2

图1-2

死锁分析:可以看出由于读进程(108)请求写进程(79)持有的X锁被阻塞的同时,写进程(79)又申请读进程(108)锁持有的S锁.读执行计划图1-3,写执行计划图1-4

(由于在默认隔离级别下(读提交)读申请S锁只是瞬间过程,读完立即释放,不会等待事务完成),所以在并发,执行频率不高的情形下不易出现.但我们模拟的高频情况使得S锁获得频率非常高,此时就出现了仅仅两个会话,一个读,一个写就造成了死锁现象.

图1-3

图1-4

        死锁原因:读操作中的键查找造成的额外锁(聚集索引)需求

        解决方案:在了解了死锁产生的原因后,解决起来就比较简单了.

        我们可以从以下几个方面入手.

        a 消除额外的键查找锁需的锁

        b 读操作时取消获取锁

        a.1我们可以创建覆盖索引使select语句中的查询列包含在指定索引中

CREATE NONCLUSTERED INDEX [inx_nlskey_incont2] ON [dbo].[testklup]
([nlskey] ASC) INCLUDE ( [cont2])

  
      a.2 根据查询需求,分步执行,通过聚集索引获取查询列,避免键查找.

declare @cont2 char(3000)
declare @clskey int
while 1=1
begin
  select @clskey=clskey from testklup where nlskey=1

  select @cont2=cont2 from testklup where clskey=@clskey
end

 
      b 通过改变隔离级别,使用乐观并发模式,读操作时源行无需锁

declare @cont2 char(3000)
while 1=1
begin
  select @cont2=cont2 from testklup with(nolock) where nlskey=1
end

 
      结束语.我们在解决问题时,最好弄清问题的本质原因,通过问题点寻找出适合自己的环境的解决方案再实施.

时间: 2024-08-13 04:31:28

深入浅出解析mssql在高频,高并发访问时键查找死锁问题的相关文章

SQL Server 高频高并发访问中的键查找死锁解析

死锁对于DBA或是数据库开发人员而言并不陌生,它的引发多种多样.一般而言,数据库应用的开发者在设计时都会有一定的考量进而尽量避免死锁的产生.但有时因为一些特殊应用场景如高频查询,高并发查询下由于数据库设计的潜在问题,一些不易捕捉的死锁可能出现从而影响业务.这里为大家介绍由于设计问题引起的键查找死锁及相关的解决办法. 这里我们在测试的同时开启trace profiler跟踪死锁视图(locks:deadlock graph).(当然也可以开启跟踪标记,或者应用扩展事件(xevents)等捕捉死锁)

【云中沙箱】如何使用SLB实现持续性高并发访问?

如何使用SLB实现持续性高并发访问?  云中沙箱实验教您如何提高云服务器的响应速度.    云中沙箱,阿里云官方实验平台.网址:http://lab.aliyunedu.net     一.基本概念    阿里云负载均衡  简介  负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端多台 ECS 的流量分发控制服务.负载均衡可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性.  架构 负载均衡服务主要有三个核心概念:  1)Load

云HBase全面支持金融云可用区-支持实时安全风控\金融时序\大数据量存储及高并发访问

前言 HBase已经全面支持金融云的业务,包括华东1.华东2.华南区域.HBase是一个通用的数据库,在金融云场景下有较多的需求,本文主要分析hbase解决哪些金融场景的需求 金融云实时风控 在安全风控的场景下,我们往往需求存储大量的结构化数据,主要因为越多的数据,画像风控越精准,阿里蚂蚁金融实时风控流程图如下: 1.数据源会产生在各个地方,以事件为中心,事件有很多的属性,比如:人物.行为.环境.时间 等,会高并发的入库操作. 2.离线分析,我们往往会对历史数据进行较高的并发分析,分析完成后.要

应对网站高并发访问的四个建议

将硬盘读写分离.功能和展示分开.基本功能封状成类及在设计架构时保证其扩容性,对大型网站建设至关重要. 互联网不断扩大的规模.日益增长的用户群以及Web2.0的兴起,对网站建设提出了新的要求,它要具备高性能和高可扩展性,同时要支持高度并发的访问. 将硬盘读写分离 如果网站硬盘的读写性能是整个网站性能提升的瓶颈,那么可考虑将硬盘的读.写功能分开,分别进行优化.在用来写的硬盘上,如果我们提升硬盘的I/O,那么肯定会增加整个文件系统的故障率,因为它是所有驱动器的故障率之和.硬盘的I/O和故障率不能兼得.

亿级流量电商详情页系统的大型高并发与高可用缓存架构实战

对于高并发的场景来说,比如电商类,o2o,门户,等等互联网类的项目,缓存技术是Java项目中最常见的一种应用技术.然而,行业里很多朋友对缓存技术的了解与掌握,仅仅停留在掌握redis/memcached等缓存技术的基础使用,最多了解一些集群相关的知识,大部分人都可以对缓存技术掌握到这个程度.然而,仅仅对缓存相关的技术掌握到这种程度,无论是对于开发复杂的高并发系统,或者是在往Java高级工程师.Java资深工程师.Java架构师这些高阶的职位发展的过程中,都是完全不够用的.技术成长出现瓶颈,在自己

阿里巴巴 JAVA开发手册 内含大量规范,应用范例.涉及数据库,高并发,集合,索引等等大量干货

  阿里巴巴 JAVA开发手册 Java开发手册 版本号 制定团队 更新日期 备  注 1.0.0 阿里巴巴集团技术部 2016.12.7 首次向Java业界公开 一.编程规约 (一)命名规约 1.  [强制]所有编程相关命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束. 反例:  _name  /  __name  /  $Object  /   name_  /  name$  /  Object$ 2.  [强制]所有编程相关的命名严禁使用拼音与英文混合的方式,更不允许直接使

php根据url自动生成缩略图并处理高并发问题

服务器生成缩略图的时机一般分为两种: 1.上传文件时生成 优点:上传时就已经生成需要的缩略图,读取时不需要再判断,减少cpu运算. 缺点:当缩略图尺寸变化时或新增尺寸时,需要重新生成所有的缩略图. 2.访问时生成 优点:1.当有用户访问时才需要生成,没有访问的不用生成,节省空间. 2.当修改缩略图尺寸时,只需要修改设置,无需重新生成所有缩略图. 缺点:当缩略图不存在需要生成时,高并发访问会非常耗服务器资源. 虽然访问时生成会有高并发问题,但其他优点都比第一种方法好,因此只要解决高并发问题就可以.

高并发低基数多字段任意组合查询的优化

1.问题 首先解释一下这个标题里出现的"低基数多字段任意组合查询"指什么东西.这里是指满足下面几个条件的查询: 1. 检索条件中涉及多个字段条件的组合 2. 这些字段的组合是不确定的 3. 每个单独字段的选择性都不好 这种类型的查询的使用场景很多,比如电商的商品展示页面.用户会输入各种不同查询条件组合:品类,供应商,品牌,促销,价格等等...,最后往往还要对结果进行排序和分页. 这类问题令人头疼的地方在于: 1. 记录数量众多,如果进行全表扫描性能低下无法满足高并发访问的要求. 2.

如何解决网站大规模并发访问带来的性能下降问题

摘要: 再过半个月就2013年的春运就要来临,每年外地打工的人们都会因为订票而烦恼.特别是网上订票,对12306提供给的网上订票系统会有各种看法,从去年的年春节,铁道部推出12306网站, 再过半个月就2013年的春运就要来临,每年外地打工的人们都会因为订票而烦恼.特别是网上订票,对12306提供给的网上订票系统会有各种看法,从去年的年春节,铁道部推出12306网站,实行网络实名购票,每一个返乡人原以为能买着一张回家的火车票,但结果还是大失所望.在去年,7天内,12306网站访问用户已占全球互联