为什么sleeping的会话会造成阻塞
1.SQL SERVER日常运维巡检系列之-日志2.关于SQL Server镜像的一个小误区3.一切从“简”,解放IT运维人员4.CPU问题定位与解决5.数据库优化案例——————某市中心医院HIS系统6.系统隐形杀手——阻塞与等待7.SQL Server常见问题介绍及快速解决建议8.tempdb日志文件暴增分析9.数据库服务器CPU不能全部利用原因分析10.如何快速定位TempDB产生问题11.索引的重要性12.SQL语句的优化建议13.通过分析等待类型解决系统产生问题14.磁盘问题定位与解决15.内存问题定位与解决16.写给数据库运维的兄弟17.为什么带NOLOCK的查询语句还会造成阻塞18.链接服务器查询导致的阻塞19.CXPACKET等待类型分析20.为什么sleeping的会话会造成阻塞(2)
21.为什么sleeping的会话会造成阻塞
22.为SQL Server配置连接加密23.SQL SERVER——高可用技术概述24.数据库服务器CPU不能全部利用原因分析25.管理工具造成的阻塞26.自动增长配置不合理导致的性能抖动27.Profiler导致的严重性能问题28.CPU持续100%分析并解决分析29.tempdb大量闩锁等待问题分析30.探究SQL SERVER 更改跟踪31.tempdb数据文件暴增分析32.SQL SERVER 2016 AlwaysOn 无域集群+负载均衡搭建与简测33.Moebius兼容AlwaysOn34.Moebius for SQL Server35.SQL SERVER日常运维巡检系列——数据库备份36.SQL SERVER日常运维巡检系列——结构设计37.Moebius for SQL Server38.SQL SERVER日常运维巡检系列之-数据库39.【能力提升】SQL Server常见问题介绍及快速解决建议40.CDC作业历史记录无法删除问题41.为Oracle链接服务器使用分布式事务42.大事务导致数据库恢复时间长43.SQL Server关于AlwaysOn的理解-读写分离的误区(一)44.链接服务器导致SQL Server停止响应45.简单配置Sql专家云46.SQL专家云回溯某时间段内的阻塞47.SQL专家云快速解决阻塞48.SQL专家云汇总低效的SQL语句49.数据库优化案例—某市中心医院HIS系统50.细说数据库协作运维51.医院核心数据库一体化建设实践52.【能力提升】SQL Server常见问题介绍及快速解决建议53.Moebius数据库多活集群54.30分钟带你熟练性能优化的那点儿事儿(案例说明)55.SQL Server底层架构技术对比56.Moebius兼容AlwaysOn57.透过等待看数据库58.数据库自动收缩造成的阻塞59.CPU持续100%分析并解决背景
客户反映HIS数据库每天22点后都会发生阻塞,阻塞的源头是一个sleeping的会话,越阻塞越多,只能通过手动KILL掉才能解决,十分不解为什么状态为sleeping的会话会造成阻塞。
现象
在SQL专家云的活动会话中,回溯22点一个小时内的运行情况,从22点开始出现阻塞情况。
转到活动会话原始数据,看到ID为2661的会话是阻塞源头,且状态为sleeping。
查看2661的完整信息,发现该会话中有3个打开的事务,一直没有关闭,打开事务的时间为22:00。
再转到22:00的活动会话原始数据,发现会话2661被会话615阻塞。当时2661正在执行到一个存储过程的UPDATE语句。
会话615是一个作业,22点开始执行,执行时间91秒。
分析
通过回溯,很容易分析阻塞的原因,首先22:00运行的作业会话615阻塞了会话2661,当时会话2661正在执行的SQL语句为存储过程中的语句update yz_zy_patient。
通过存储过程的定义可以看到,会话2661在被阻塞之前,已经执行完了begin tran和update mz_charge_detail语句。

因为会话2661一直被阻塞,直到30秒后超时,所以不会执行到下面的COMMIT语句。最重要的是,应用程序实现的不健壮,语句超时报错后没有进行错误处理,回滚事务并关闭连接(会话),导致会话2661变成了一个“僵尸”会话。因为没有处理事务,会话2661一直持有对表mz_charge_detail更改的数据行的排他锁,其他会话在对表mz_charge_detail进行更新时就会被一直阻塞。
解决
- 修改应用程序,增加对执行异常的捕获,回滚事务并关闭连接。这是最根本的解决办法。
- 修改存储过程,在事务开始之前增加SET XACT_ABORT ON语句,当 SET XACT_ABORT 为 ON 时,如果 SQL 语句产生运行时错误,整个事务将自动终止并回滚。在修改应用程序之前作为临时解决办法。
自动查杀会话
sleeping会话导致阻塞是一个非常普遍的问题,因为很多客户是购买软件厂商的产品,修改程序的根本解决办法不容易落实。因此只能在数据库端进行补偿性的措施,就是配置一个自动查杀会话的作业,根据这种会话的特征定期KILL掉。也可以在SQL专家云中启用自动查杀会话的功能。
合集:
SQL Server数据库运维
标签:
故障排查
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2017-02-14 SQL语句的优化建议