注册
达梦数据库死锁问题处理和不同工具的处理结果对比
培训园地/ 文章详情 /

达梦数据库死锁问题处理和不同工具的处理结果对比

广志 2023/05/19 1629 0 0

1、进行模拟还原故障测试
①--创建测试表和测试数据
create table testlock (id int,name char(30));
insert into testlock values(1,'aaa');
insert into testlock values(2,'bbb');
insert into testlock values(12,'ccc');
insert into testlock values(3,'das');
insert into testlock values(4,'fds');
②用会话A和B模拟应用不同用户登录进行的数据修改操作(DML)
按顺序执行,不commit提交,模拟用户修改未提交操作
--会话A修改数据
update testlock set id=1 where name='bbb';
--会话B修改数据
update testlock set id=2 where name='aaa';
--会话A修改数据
update testlock set id=3 where name='aaa';
再次在A上修改操作发现就夯住了

--会话B修改数据
update testlock set id=4 where name='bbb';
再在B上执行就报错死锁

③以下两个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);

select lc.lmode,lc.table_id,lc.blocked,vtw.id as trx_id, vs.sess_id, vs.sql_text, vs.appname, vs.clnt_ip
from v$lock lc
left join v$trxwait vtw on (lc.trx_id=vtw.id)
left join v$trx vt on (vtw.id=vt.id)
left join v$sessions vs on (vt.sess_id=vs.sess_id)
where vs.sql_text is not null;

由上面的结果不难看出,死锁的会话是SESS_ID的值
④杀死会话
会话A上的显示情况(数据库断开了连接)

⑤此时回到B上执行完最后一条sql
update testlock set id=4 where name='bbb';
进行提交,查询结果

⑥此时会发现会话A上的最后一条语句是没有执行的,需要再次执行提交才可以生效
update testlock set id=3 where name='aaa';

⑦现在用disql登录两个会话,按照上面的顺序进行操作,杀死死锁会话,查看会话A上的结果

不难发现,A会话进行了自动重连并且执行了以下操作
update testlock set id=3 where name='aaa';
直接在B会话上执行下面的sql,提交查看情况

2、如上可以看出,manager管理工具会话断开不会重连,disql会话会重连并执行结束未完成的sql。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服