为什么sleeping的会话会造成阻塞(2)
背景
客户反馈系统突然从11:10开始运行非常缓慢,在SQL专家云中看到大量的产生阻塞的活动会话,KILL掉阻塞的源头马上又出现新的源头,实在没有办法只能重启应用程序断开所有数据库连接才解决,请我们协助分析根本的原因。
现象
登录SQL专家云,进入趋势分析页面,下钻到11点钟内一个小时的数据,看到从11:12开始出现阻塞,越来越严重。
进入活动会话原始数据页面,看到不同时间点的阻塞源头会话是不同的,但都是同一类的现象,阻塞源头会话的状态是sleeping,被阻塞的会话都在对同一个表执行UPDATE语句。
分析
状态为sleeping代表当前会话没有执行SQL请求,之所以造成阻塞是因为会话以前开启了一个或多个事务, 在事务中修改了一个或多个表的数据,会话对这些修改的数据行持有排他锁,从而阻塞其他会话对该表的操作。如果这种状态持续很长时间,很有可能是前端应用程序出现了异常,并且没有健壮的异常处理机制,出错后没有回滚以前打开的事务并关闭连接,导致阻塞一直存在。 前端应用程序出错原因主要有两种,一种是执行SQL语句时被阻塞等原因导致执行时间长并产生超时;一种是执行非数据库访问逻辑时因为某些原因出错了,例如转换数据类型失败、接收数据量太大导致内存溢出、访问别的接口报错等。
本着这个经验,对这些sleeping的会话进行回溯,发现这些会话在sleeping之前,都曾经被阻塞过很长时间,根据慢语句的特征判断是执行超时了。
而且这些会话都存在打开的事务,事务开始时间都在执行语句超时的时间之前。
通过对存储过程进行分析,发现里面在用TRY CATCH的方式处理事务,因此推断该方式无法捕获应用程序端的超时错误,导致事务和连接的泄露,因为存储过程比较复杂,下面用一个测试来模拟。
测试
首先创建一个存储过程,逻辑为先开始事务,然后依次对两个表进行UPDATE,通过TRY CATCH的方法处理事务。
CREATE PROCEDURE dbo.usp_test
AS
BEGIN TRAN BEGIN TRY
UPDATE
dbo.Table_2 WITH(ROWLOCK)
SET
a = 'wang' UPDATE
dbo.Table_1 WITH(ROWLOCK)
SET
a = 'wang'
END TRY
BEGIN CATCH
IF @@ERROR = 0
BEGIN
GOTO succeed
END
ELSE
BEGIN
GOTO error
END
END CATCH succeed:
COMMIT TRAN
RETURN 1
error:
ROLLBACK TRAN
RETURN 0
新建一个查询,开始一个事务,然后执行UPDATE Table_1,不提交或者回滚事务,对表Table_1的排他锁一直存在, 用来模拟对表Table_1的锁定。
新建另一个查询,注意,执行超时值设置为30秒(默认是0,代表永不超时)。这个新建立的会话ID是56。
执行存储过程usp_test。updat dbo.Table_2很快执行完,在执行updat dbo.Table_1时产生阻塞,等待30秒后出现超时的报错。
新建一个查询,查看会话56的事务信息,可以看到存在一个打开的事务。
再通过sys.dm_tran_locks可以看到会话56还保持着对表Table_2和Table_1的意向排他锁以及Table_2上更改的两行数据的排他锁。此时在其他会话中对Table_2执行查询和修改,都被会话56阻塞。
总结:“超时”错误是应用程序端的异常,数据库驱动程序执行SQL语句时等待服务器端的响应,等待时间达到设置的阈值后发送一个终止执行的信号给服务器端并向上层应用程序抛出异常。服务器端接收到该信号后终止语句的执行,并不会报错,TRY CATCH是无法捕获的,因此无法执行到SUCCEED处的COMMIT或者ERROR处的ROLLBACK,导致了事务的泄露,该事务中的对表Table_2的排他锁一直持有,其他会话对表Table_2的操作会被阻塞,直到杀掉该会话。
解决
对于这类问题,根本的解决方法是修改应用程序,增加对于执行异常的捕获,检查是否存在事务并回滚,然后关闭数据库连接。
但是很多客户是购买软件厂商的产品,修改程序不容易实现或者周期很长。因此只能在数据库端进行补偿性的措施,就是配置一个自动查杀会话的作业,根据sleeping会话的特征定期KILL掉。也可以在SQL专家云中启用自动查杀会话的功能。
为什么sleeping的会话会造成阻塞(2)的更多相关文章
- Oracle RAC环境下定位并杀掉最终阻塞的会话
实验环境:Oracle RAC 11.2.0.4 (2节点) 1.模拟故障:会话被级联阻塞 2.常规方法:梳理找出最终阻塞会话 3.改进方法:立即找出最终阻塞会话 之前其实也写过一篇相关文章: 如何定 ...
- 会话执行存储过程,等待被阻塞,Kill session场景模拟
本次场景来源: 通知某个会话:执行execute addupp(1,'five');类似的存储过程,会话等待:(会话等待两种情况:一种确实执行,但是未完成:另一种就是执行的操作无法获取资源,等待资源释 ...
- MySQL的共享锁阻塞会话案例浅析输入日志标题
这是问题是一个网友遇到的问题:一个UPDATE语句产生的共享锁阻塞了其他会话的案例,对于这个案例,我进一步分析.总结和衍化了相关问题.下面分析如有不对的地方,敬请指正.下面是初始化环境和数据的 ...
- 初涉SQL Server性能问题(2/4):列出等待资源的会话
在初涉SQL Server性能问题(1/4)里,我们知道了如何快速检查服务器实例上正运行的任务数和IO等待的任务数.这个是轻量级的脚本,不会给服务器造成任何压力,即使服务器在高负荷下,也可以正常获得结 ...
- 一个特殊的SQL Server阻塞案例分析
上周,在SQL Server数据库下面遇到了一个有意思的SQL阻塞(SQL Blocking)案例.其实个人对SQL Server的阻塞还是颇有研究的.写过好几篇相关文章. 至于这里为什么要总结一下这 ...
- SQL Server中SELECT会真的阻塞SELECT吗?
在SQL Server中,我们知道一个SELECT语句执行过程中只会申请一些意向共享锁(IS) 与共享锁(S), 例如我使用SQL Profile跟踪会话86执行SELECT * FROM dbo.T ...
- With(ReadPast)就不会被阻塞吗?
在生产环境中,会有很多使用ReadPast查询提示的场合,来避免正在被其它事务锁定的行对当前查询造成阻塞,而又不会获取到“脏数据”. 可是很多人都疑惑,为什么我使用了ReadPast仍然有时会被阻塞? ...
- SQL Server 监控统计阻塞脚本信息
数据库产生阻塞(Blocking)的本质原因 :SQL语句连续持有锁的时间过长 ,数目过多, 粒度过大.阻塞是事务隔离带来的副作用,它是不可避免的,而且是一个数据库系统常见的现象. 但是阻塞的 ...
- DBA常用SQL之会话与等待事件
SELECT * FROM V$SESSION WHERE USERNAME IS NOT NULL AND STATUS = 'ACTIVE' ORDER BY LOGON_TIME, SID; 1 ...
- 查看数据库中有哪些活动的事务,对应的会话id,执行的语句
select dbt.database_id, DB_NAME(dbt.database_id) '数据库名', dbt.transaction_id, at.name, at.transaction ...
随机推荐
- 软件开发-客观综合(GO)
1 对从go源码和汇编源码生成可执行程序的过程,下面描述错误的是() A. 使用go tool compile可以将go源码编译成目标文件 B. 使用go tool asm可以将go源码编译成汇编代 ...
- 编码工具使用(go语言)
1.课程介绍 Git基础课程和实操 Goland介绍以及常用快捷键使用 Go delve 调试 你想要的linux 这里都有 2.版本控制工具介绍 原始的版本控制 修改文件,保存文件副本 版本控制的起 ...
- centos7 ftp服务搭建记录
1. 装包与卸载 yum -y install vsftpd yum -y autoremove vsftpd&&rm -rf /etc/vsftpd /etc/pam.d/vsftp ...
- 推荐一款 .NET 编写的 嵌入式平台的开源仿真器--Renode
Renode 是一个开发框架,通过让你模拟物理硬件系统来加速物联网和嵌入式系统开发. Renode 可以模拟 Cortex-M.RISC-V 等微控制器,不仅可以模拟 CPU指令,还可以模拟外设,甚至 ...
- Windows 服务器中使用 mysqldump 命令导出数据,解决中文乱码问题
起因 环境:阿里云服务器(windows server).mysql(8.0.11) mysql> select @@version; +-----------+ | @@version | + ...
- jjava基础语法
java基础语法1 注释 注意: SDK要选择JDK1.8,且下面的语言要选择8,配置完这个环境后,JAVA才能正常运行. 单行注释 //+text 快捷键:ctrl+/ 多行注释 /*+text+ ...
- 网络编程 - OSI七层协议详解
目录 网络编程基础 软件开发架构 网络编程简介 OSI七层协议简介 OSI协议之物理连接层 OSI协议之数据链路层 网络相关专业名词 OSI之网络层 OSI协议之传输层 传输层之TCP协议/UDP协议 ...
- python面向对象推导流程
举例:猫狗大战 # 1.例如我们要编写一个猫狗对战小游戏 # 首先我们要定义一个猫,和一只狗 cat1 = { 'name': '小白猫', 'type': '宠物猫', 'attack_val': ...
- 3D旋转不能对齐,元素边倾斜
1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset=" ...
- [奶奶看了都会]ChatGPT保姆级注册教程
大家好,我是小卷 最近几天OpenAI发布的ChatGPT聊天机器人火出天际了,连着上了各个平台的热搜榜.这个聊天机器人最大的特点是模仿人类说话风格同时回答大量问题. 有人说ChatGPT是真正的人工 ...