背景

客户反映HIS数据库每天22点后都会发生阻塞,阻塞的源头是一个sleeping的会话,越阻塞越多,只能通过手动KILL掉才能解决,十分不解为什么状态为sleeping的会话会造成阻塞。

现象


在SQL专家云的活动会话中,回溯22点一个小时内的运行情况,从22点开始出现阻塞情况。

转到活动会话原始数据,看到ID为2661的会话是阻塞源头,且状态为sleeping。

查看2661的完整信息,发现该会话中有3个打开的事务,一直没有关闭,打开事务的时间为22:00。

再转到22:00的活动会话原始数据,发现会话2661被会话615阻塞。当时2661正在执行到一个存储过程的UPDATE语句。

在慢语句中找到会话2661,执行时间为30秒多一点。向客户证实,程序上设置的SQL语句的超时时间为30秒,说明2661被阻塞导致超时了。

会话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进行更新时就会被一直阻塞。

解决


  1. 修改应用程序,增加对执行异常的捕获,回滚事务并关闭连接。这是最根本的解决办法。

  1. 修改存储过程,在事务开始之前增加SET XACT_ABORT ON语句,当 SET XACT_ABORT 为 ON 时,如果 SQL 语句产生运行时错误,整个事务将自动终止并回滚。在修改应用程序之前作为临时解决办法。

自动查杀会话


sleeping会话导致阻是一个非常普遍的问题,因为很多客户是购买软件厂商的产品,修改程序的根本解决办法不容易落实。因此只能在数据库端进行补偿性的措施,就是配置一个自动查杀会话的作业,根据这种会话的特征定期KILL掉。也可以在SQL专家云中启用自动查杀会话的功能。

为什么sleeping的会话会造成阻塞相关推荐

  1. 为什么sleeping的会话会造成阻塞(2)

    背景 客户反馈系统突然从11:10开始运行非常缓慢,在SQL专家云中看到大量的产生阻塞的活动会话,KILL掉阻塞的源头马上又出现新的源头,实在没有办法只能重启应用程序断开所有数据库连接才解决,请我们协 ...

  2. 阻塞会话_使用根会话解决SQL阻塞链并进行故障排除

    阻塞会话 In this article, we will study how to recognize and resolve the SQL blocking chain by determini ...

  3. SQL Server通过动态视图里查找阻塞超过30秒的会话

    SQL Server通过动态视图里查找阻塞的会话 简介 对于阻塞我们可以通过动态视图dm_exec_requests.dm_tran_locks等关联通过构建递归式树形结构来查找出阻塞超过30秒的会话 ...

  4. Oracle RAC环境下如何定位并杀掉最终阻塞的会话

    ‍ ‍ 导读:Oracle RAC环境下定位并杀掉最终阻塞的会话,本文通过一个测试demo来具体介绍. 实验环境: Oracle RAC 11.2.0.4 (2节点) 1.模拟故障:会话被级联阻塞 2 ...

  5. oracle锁概念,阻塞

    一.锁(Lock) 1.1 锁的概念 数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据 ...

  6. SQL Server中SELECT会真的阻塞SELECT吗?

    在SQL Server中,我们知道一个SELECT语句执行过程中只会申请一些意向共享锁(IS) 与共享锁(S), 例如我使用SQL Profile跟踪会话86执行SELECT * FROM dbo.T ...

  7. 查看数据库中有哪些活动的事务,对应的会话id,执行的语句

    select dbt.database_id, DB_NAME(dbt.database_id) '数据库名', dbt.transaction_id, at.name, at.transaction ...

  8. Oracle优化02-锁和阻塞

    思维导图 概述 之前梳理了一篇博文 Oracle-锁解读 首先弄清楚两个概念: 并发 concurrency: 超过两个以上的用户对相同的数据做修改 并行 parallel:将一件事情分成很多小的部分 ...

  9. SQL Server 监控统计阻塞脚本信息

    数据库产生阻塞(Blocking)的本质原因 :SQL语句连续持有锁的时间过长 ,数目过多, 粒度过大.阻塞是事务隔离带来的副作用,它是不可避免的,而且是一个数据库系统常见的现象. 但是阻塞的时间和出 ...

最新文章

  1. 15 -Flask构建弹幕微电影网站-基于角色的访问控制
  2. 湖南对口升学计算机组装考点,全国计算机等级考试湖南省考点名单及联系方式...
  3. 纯JS制作的窗户雨滴效果
  4. java基本数据类型线程_Java基本数据类型
  5. Tech Websites
  6. 一文读懂Python web框架和web服务器之间的关系
  7. 2d 蓝图_“二渲三”打破传统思维!Netflix冲奥动画会推动2D动画变革吗?
  8. Flutter布局锦囊---绑定手机页
  9. Google 发布开源库 TFQ,快速建立量子机器学习模型!
  10. Marquee无间隙滚动(二)
  11. python爬虫教程-有什么好的python3爬虫入门教程或书籍吗?
  12. android 手机 平板同屏,多屏互动手机与平板互相投屏
  13. 二战十大致命武器之“喷火”式战斗机
  14. 硬盘盒刷固件使其不休眠
  15. my1.exec()==QDialog::Accepted
  16. MPC-BE 1.6.0.6370 Beta 经典多媒体播放器
  17. mysql pt kill脚本_使用pt-kill为MySQL保驾护航
  18. C语言计算一元二次方程的根(完全版)
  19. linux cut指令
  20. 搞定iOS的几种页面跳转方式

热门文章

  1. 如何做好 PPT(蔡学镛演讲稿)
  2. Nginx 通过 certbot 为网站自动配置 SSL 证书并续期
  3. 机器学习常用概念辨析
  4. 计算机四级和软考哪个难?
  5. Hadoop生态之Flume
  6. 调剂厦大计算机,2017年厦门大学考研调剂时间以及调剂注意事项
  7. edusoho 二次开发
  8. 三、MT8168 MIPI DSI LCD驱动指南
  9. Ubuntu18.04配置Seetaface6
  10. Property使用