ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

锁等待处理

2022-01-31 13:02:18  阅读:141  来源: 互联网

标签:SESS 处理 id TRX VS SQL 等待 ID


一、查出具体造成锁等待的语句 

模拟达梦数据库DML操作可能会出现的行锁等待:

会话一:更新表test_lock中id=2的(id字段为主键字段)一行数据,更新成功,未提交:

SQL> update test_lock set name='Change_na' where id=2;affect rows 1used time: 2.103(ms). Execute id is 3106.

会话二:继续更新表test_lock中id=2的这一行数据,未更新成功,处于等待状态:

SQL> update test_lock set name='Change_Tw' where id=2;

-- 会话二会hang住,因为它在等待会话一持有的资源,仅当会话一提交或回滚后才能执行成功。

前面已经模拟出锁等待问题,这里我们需要处理一下锁等待:

1)首先,查看被挂起的事务(TRX_ID)​​​​​​​

SQL> SELECT VTW.ID AS TRX_ID, VS.SESS_ID ,VS.SQL_TEXT,VS.APPNAME ,VS.CLNT_IP FROM V$TRXWAIT VTW LEFT JOIN V$TRX VT ON (VTW.ID=VT.ID) LEFT JOIN V$SESSIONS VS ON (VT.SESS_ID=VS.SESS_ID); LINEID     TRX_ID               SESS_ID              SQL_TEXT                                          APPNAME CLNT_IP         ---------- -------------------- -------------------- ------------------------------------------------- ------- ----------------1          6158                 139808835965528      update test_lock set name='Change_Tw' where id=2; used time: 18.065(ms). Execute id is 3700.

2)通过挂起事务ID(TRX_ID)找到它等待的事务(WAIT_FOR_ID)。​​​​​​​

SQL> SELECT WAIT_FOR_ID,WAIT_TIME FROM V$TRXWAIT WHERE ID=6158;  LINEID     WAIT_FOR_ID          WAIT_TIME  ---------- -------------------- -----------1          6157                 108572 used time: 1.843(ms). Execute id is 3701.

3)通过等待事务ID(WAIT_FOR_ID)定位到连接以及执行的语句​​​​​​​

SQL> SELECT VT.ID AS TRX_ID, VS.SESS_ID, VS.SQL_TEXT, VS.APPNAME, VS.CLNT_IP FROM V$TRX VT LEFT JOIN V$SESSIONS VS ON (VT.SESS_ID=VS.SESS_ID) WHERE VT.ID = 6157;LINEID     TRX_ID               SESS_ID              SQL_TEXT                                          APPNAME CLNT_IP         ---------- -------------------- -------------------- ------------------------------------------------- ------- ----------------1          6157                 139809037292120      update test_lock set name='Change_na' where id=2; used time: 6.749(ms). Execute id is 3702.

 二、处理引起锁等待的语句 

对于引起锁等待的语句,优先kill,保障系统稳定。后续再对抓取到的语句进行分析、定位。

1)kill掉引起锁等待的语句:​​​​​​​

SQL> SP_CLOSE_SESSION(139809037292120);DMSQL executed successfullyused time: 0.796(ms). Execute id is 3703. 

2)再去查看会话二,发现update操作已经执行成功:​​​​​​​

SQL> update test_lock set name='Change_Tw' where id=2;affect rows 1used time: 00:04:42.183. Execute id is 3600.SQL>

注:对于这种锁等待问题,若是业务侧引起,一般是业务逻辑存在缺陷,需要检查代码并修复;若是运维侧引起,一般是操作不规范引起,需及时整治。不论是那种情况,都需慎重处理,规范开发和运维规范。

引入官方文档的描述:

在 DM 数据库中, INSERT、 UPDATE、 DELETE 是最常见的会产生阻塞和死锁的语句。

INSERT 发生阻塞的唯一情况是, 当多个事务同时试图向有主键或 UNIQUE 约束的表中插入相同的数据时,其中的一个事务将被阻塞,直到另外一个事务提交或回滚。一个事务提交时,另一个事务将收到唯一性冲突的错误;一个事务回滚时,被阻塞的事务可以继续执行。

当 UPDATE 和 DELETE 修改的记录,已经被另外的事务修改过, 将会发生阻塞,直到另一个事务提交或回滚。

标签:SESS,处理,id,TRX,VS,SQL,等待,ID
来源: https://blog.csdn.net/robo23/article/details/122759269

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有