为什么sleeping的会话会造成阻塞
背景
客户反映HIS数据库每天22点后都会发生阻塞,阻塞的源头是一个sleeping的会话,越阻塞越多,只能通过手动KILL掉才能解决,十分不解为什么状态为sleeping的会话会造成阻塞。
现象
在SQL专家云的活动会话中,回溯22点一个小时内的运行情况,从22点开始出现阻塞情况。
![](/assets/blank.gif)
转到活动会话原始数据,看到ID为2661的会话是阻塞源头,且状态为sleeping。
![](/assets/blank.gif)
查看2661的完整信息,发现该会话中有3个打开的事务,一直没有关闭,打开事务的时间为22:00。
![](/assets/blank.gif)
再转到22:00的活动会话原始数据,发现会话2661被会话615阻塞。当时2661正在执行到一个存储过程的UPDATE语句。
![](/assets/blank.gif)
在慢语句中找到会话2661,执行时间为30秒多一点。向客户证实,程序上设置的SQL语句的超时时间为30秒,说明2661被阻塞导致超时了。
![](/assets/blank.gif)
会话615是一个作业,22点开始执行,执行时间91秒。
![](/assets/blank.gif)
![](/assets/blank.gif)
分析
通过回溯,很容易分析阻塞的原因,首先22:00运行的作业会话615阻塞了会话2661,当时会话2661正在执行的SQL语句为存储过程中的语句update yz_zy_patient。
![](/assets/blank.gif)
通过存储过程的定义可以看到,会话2661在被阻塞之前,已经执行完了begin tran和update mz_charge_detail语句。
![](/assets/blank.gif)
因为会话2661一直被阻塞,直到30秒后超时,所以不会执行到下面的COMMIT语句。最重要的是,应用程序实现的不健壮,语句超时报错后没有进行错误处理,回滚事务并关闭连接(会话),导致会话2661变成了一个“僵尸”会话。因为没有处理事务,会话2661一直持有对表mz_charge_detail更改的数据行的排他锁,其他会话在对表mz_charge_detail进行更新时就会被一直阻塞。
![](/assets/blank.gif)
解决
修改应用程序,增加对执行异常的捕获,回滚事务并关闭连接。这是最根本的解决办法。
修改存储过程,在事务开始之前增加SET XACT_ABORT ON语句,当 SET XACT_ABORT 为 ON 时,如果 SQL 语句产生运行时错误,整个事务将自动终止并回滚。在修改应用程序之前作为临时解决办法。
自动查杀会话
sleeping会话导致阻是一个非常普遍的问题,因为很多客户是购买软件厂商的产品,修改程序的根本解决办法不容易落实。因此只能在数据库端进行补偿性的措施,就是配置一个自动查杀会话的作业,根据这种会话的特征定期KILL掉。也可以在SQL专家云中启用自动查杀会话的功能。
![](/assets/blank.gif)
为什么sleeping的会话会造成阻塞相关推荐
- 为什么sleeping的会话会造成阻塞(2)
背景 客户反馈系统突然从11:10开始运行非常缓慢,在SQL专家云中看到大量的产生阻塞的活动会话,KILL掉阻塞的源头马上又出现新的源头,实在没有办法只能重启应用程序断开所有数据库连接才解决,请我们协 ...
- 阻塞会话_使用根会话解决SQL阻塞链并进行故障排除
阻塞会话 In this article, we will study how to recognize and resolve the SQL blocking chain by determini ...
- SQL Server通过动态视图里查找阻塞超过30秒的会话
SQL Server通过动态视图里查找阻塞的会话 简介 对于阻塞我们可以通过动态视图dm_exec_requests.dm_tran_locks等关联通过构建递归式树形结构来查找出阻塞超过30秒的会话 ...
- Oracle RAC环境下如何定位并杀掉最终阻塞的会话
导读:Oracle RAC环境下定位并杀掉最终阻塞的会话,本文通过一个测试demo来具体介绍. 实验环境: Oracle RAC 11.2.0.4 (2节点) 1.模拟故障:会话被级联阻塞 2 ...
- oracle锁概念,阻塞
一.锁(Lock) 1.1 锁的概念 数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据 ...
- SQL Server中SELECT会真的阻塞SELECT吗?
在SQL Server中,我们知道一个SELECT语句执行过程中只会申请一些意向共享锁(IS) 与共享锁(S), 例如我使用SQL Profile跟踪会话86执行SELECT * FROM dbo.T ...
- 查看数据库中有哪些活动的事务,对应的会话id,执行的语句
select dbt.database_id, DB_NAME(dbt.database_id) '数据库名', dbt.transaction_id, at.name, at.transaction ...
- Oracle优化02-锁和阻塞
思维导图 概述 之前梳理了一篇博文 Oracle-锁解读 首先弄清楚两个概念: 并发 concurrency: 超过两个以上的用户对相同的数据做修改 并行 parallel:将一件事情分成很多小的部分 ...
- SQL Server 监控统计阻塞脚本信息
数据库产生阻塞(Blocking)的本质原因 :SQL语句连续持有锁的时间过长 ,数目过多, 粒度过大.阻塞是事务隔离带来的副作用,它是不可避免的,而且是一个数据库系统常见的现象. 但是阻塞的时间和出 ...
最新文章
- 15 -Flask构建弹幕微电影网站-基于角色的访问控制
- 湖南对口升学计算机组装考点,全国计算机等级考试湖南省考点名单及联系方式...
- 纯JS制作的窗户雨滴效果
- java基本数据类型线程_Java基本数据类型
- Tech Websites
- 一文读懂Python web框架和web服务器之间的关系
- 2d 蓝图_“二渲三”打破传统思维!Netflix冲奥动画会推动2D动画变革吗?
- Flutter布局锦囊---绑定手机页
- Google 发布开源库 TFQ,快速建立量子机器学习模型!
- Marquee无间隙滚动(二)
- python爬虫教程-有什么好的python3爬虫入门教程或书籍吗?
- android 手机 平板同屏,多屏互动手机与平板互相投屏
- 二战十大致命武器之“喷火”式战斗机
- 硬盘盒刷固件使其不休眠
- my1.exec()==QDialog::Accepted
- MPC-BE 1.6.0.6370 Beta 经典多媒体播放器
- mysql pt kill脚本_使用pt-kill为MySQL保驾护航
- C语言计算一元二次方程的根(完全版)
- linux cut指令
- 搞定iOS的几种页面跳转方式