首页 > 其他分享 >达梦执行存储过程报死锁问题分析排查方法

达梦执行存储过程报死锁问题分析排查方法

时间:2024-04-03 16:33:25浏览次数:31  
标签:sess 阻塞 排查 死锁 达梦 ID block wait

最近在一个项目中调用存储过程报死锁错误,而根据DEADLOCK_HISTORY也无法看出是哪个表产生了死锁,下面模拟一下环境做测试

drop TABLE if EXISTS test; CREATE TABLE test (id int); BEGIN for i in 1 ..100 loop insert into test VALUES (i); end loop; commit; end; CREATE or REPLACE PROCEDURE pt1 as PRAGMA AUTONOMOUS_TRANSACTION; BEGIN  UPDATE TEST set id=10 where id<20;      commit; end; CREATE or REPLACE PROCEDURE pt2 as BEGIN  UPDATE TEST set id=2 where id<25 and id>5; end; CREATE or REPLACE PROCEDURE pt3 as BEGIN  pt2();  pt1(); end; exec pt3;

 对于存储过程,根据V$DEADLOCK_HISTORY只能知道调用这个存储产生了死锁,无法定位具体哪个表产生了死锁。

 由于一执行就报死锁错误。特别是一些比较复杂的存储过程,没有时间打开窗口去排查哪些表产生了阻塞。达梦DEADLOCK_CHECK_INTERVAL参数可以控制死锁检测时间,执行下面语句之后,1分钟之后才会报死锁错误

sp_set_para_value(1,'DEADLOCK_CHECK_INTERVAL',60000);  

 这段时间就可以根据相关视图查询那个表产生了阻塞

select sysdate as stat_dt,     a.WAIT_TIME/1000.0 as 阻塞时长_s   ,block_sess.APPNAME as 阻塞者程序名   ,BLOCK_SESS.CLNT_IP as 阻塞者ip   ,BLOCK_SESS.SQL_TEXT as 阻塞者当前执行的sql   ,BLOCK_SESS.SESS_ID as 阻塞者会话id   ,BLOCK_SESS.CURR_SCH as 阻塞者登录名   ,BLOCK_SESS.TRX_ID as 阻塞者事务号   ,(   select listagg2(top_sql_text||char(10))   from  V$SQL_HISTORY sh   where sh.TRX_ID=block_sess.trx_id and sh.sess_id=block_sess.sess_id   ) as 阻塞者当前事务执行过的sql --该视图保留记录数有限,如果存在长时间未提交的事务,可能导致不全,只做参考   ,wait_sess.APPNAME as 被阻塞者程序名   ,wait_SESS.CLNT_IP as 被阻塞者ip   ,wait_SESS.SQL_TEXT as 被阻塞者当前执行的sql   ,wait_SESS.SESS_ID as 被阻塞者会话id   ,wait_SESS.CURR_SCH as 被阻塞者登录名   ,wait_SESS.TRX_ID as 被阻塞者事务号 ,cast(( select listagg2(block_obj.name||':'||block_lock.lmode||'('||block_lock.ltype||')'||char(10)) from   v$lock block_lock    join sysobjects block_obj on block_obj.id= block_lock.table_ID where block_trx.ID= block_lock.trx_ID and BLOCK_LOCK.IGN_FLAG<>1 --只看不可忽略的锁 ) as varchar(100)) as 阻塞者持有的锁 ,cast(( select listagg2(wait_obj.name||':'||wait_lock.lmode||'('||wait_lock.ltype||')'||char(10)) from   v$lock wait_lock    join sysobjects wait_obj on wait_obj.id= wait_lock.table_ID where wait_trx.ID= wait_lock.trx_ID   and wait_LOCK.IGN_FLAG<>1  --只看不可忽略的锁 and WAIT_LOCK.BLOCKED=1 --被阻塞者等待持有的锁 )as varchar(100)) as 被阻塞者等待持有的锁 from SYS."V$TRXWAIT" A join SYS."V$TRX" block_trx on a.WAIT_FOR_ID= BLOCK_TRX.ID join SYS."V$TRX" wait_trx on a.ID= wait_TRX.ID join v$sessions block_sess on block_sess.sess_ID= BLOCK_TRX.sess_ID join v$sessions wait_sess on wait_sess.sess_ID= wait_TRX.sess_ID

 上面示例为什么会产生死锁,原因是采用了自治事务,自治事务使用PRAGMA AUTONOMOUS_TRANSACTION声明在过程或函数中。自治事务相对主事务是完全独立的。即使外部事务回滚或提交,自治事务中的操作不会影响到外部事务。由于执行自治事务时主事务处于挂起状态,如果自治事务需要的锁资源已经被主事务拥有则会产生死锁报错。

 

标签:sess,阻塞,排查,死锁,达梦,ID,block,wait
From: https://www.cnblogs.com/fangzpa/p/18113007

相关文章

  • 国产达梦数据库与mysql特点、区别、发展前景
    国产达梦数据库与mysql的区别国产达梦数据库(DM)和MySQL是两种不同的关系型数据库管理系统(RDBMS),它们有许多区别,包括特性、功能、性能、可用性、适用场景等。以下是它们之间的一些主要区别:公司背景:MySQL:MySQL最初由瑞典的MySQLAB公司开发,后来被SunMicrosystems收购,随......
  • 应急响应流程与挖矿病毒排查流程
    1.应急响应的流程1.1.为什么会有应急响应?在工作过程中,会遇到突发的情况,比如:DOS攻击,渗透攻击,病毒感染,需要立即将这些问题清除掉,恢复正常的生产秩序。这个过程就是应急响应。1.2.流程收集信息:收集客户的信息,以及遭遇情况的表现症状。判断类型:判断是否为安全事件,是哪......
  • 进程调度-死锁-存储管理-固定分页分段
    进程调度进程调度方式是指当有更高优先级的进程到来时如何分配CPU。分为可剥夺和不可剥夺两种,可剥夺指当有更高优先级进程到来时,强行将正在运行进程的CPU分配给高优先级进程;不可剥夺是指高优先级进程必须等待当前进程自动释放CPU。在某些操作系统中,一个作业从提交到完成需要经......
  • 视频监控/云存储/AI智能分析平台EasyCVR集成时调用接口报跨域错误的原因排查
    EasyCVR视频融合平台基于云边端架构,可支持海量视频汇聚管理,能提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、智能分析等视频服务。平台兼容性强,支持多协议、多类型设备接入,包括:国标GB/T28181协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK......
  • Kylin Desktop V10部署达梦数据库(DM8)
    1.环境处理器:飞腾D2000/8E8C内存:16GB系统:银河麒麟桌面版操作系统(国防版)V10达梦数据库:dm8_20231226_FTarm2000_kylin10_sp1_642.软件下载链接:https://www.dameng.com/list_103.html3.环境部署我这里已经下载好了(软件、环境部署脚本),需拷贝至桌面运行no1.sh,安装完成后运行n......
  • 进程的操作与管理(PV方法/死锁/存储方法)
     操作系统本质上是人机之间交互的接口,人通过操作系统(比如命令行、窗口、菜单)去操控计算机硬件;同时也是应用软件与硬件之间的接口(换而言之可以控制程序的运行)。操作系统的五大作用:进程管理、存储管理、文件管理、作业管理、设备管理上图就是典型的计算机结构:硬件层......
  • 记一次使用spring事件机制失效排查修复
    前言在日常业务开发中过程,我们有时候为了业务解耦,会利用spring的机制,就是利用spring提供的ApplicationListener、ApplicationEventMulticaster等核心API来实现。(注:我这边列的是核心底层API接口,正常我们会用监听事件用@EventListener,发布事件用applicationContext.publishEvent()......
  • Java并发-如何避免死锁
    一般在Java项目里用到锁的场景不多,有朋友调侃说用到锁的次数还没有面试被问到的次数多,哈哈!1、死锁如何产生说句难听话,锁一般都很少用到,何况死锁呢?想产生死锁还是有点难的,需要满足2个条件:共享资源同时只能被一个线程使用,如果已经有一个线程占用了资源,其余线程只能等待,直到资......
  • 在Linux中,有哪些故障排查和诊断工具?
    在Linux中,有多种故障排查和诊断工具可以帮助管理员和开发者快速定位和解决系统或应用程序中的问题。以下是一些常用的故障排查和诊断工具:dmesg命令:dmesg是一个用于显示内核控制的各种消息的工具,包括硬件状态、驱动加载和系统错误等。通过查看这些消息,管理员可以了解系统启动......
  • 运维排查 | Systemd 之服务停止后状态为 failed
    哈喽大家好,我是咸鱼。我们知道CentOS7之后,Systemd代替了原来的SystemV来管理服务,相比SystemV,Systemd能够很好地解决各个服务间的依赖关系,还能让所有的服务同时启动,而不是串行启动。通常情况下,yum安装的软件会由系统的包管理器(如RPM)安装,并且会配置相应的systemd服务......