达梦锁查询及阻塞会话处理测试
新建两个测试表,插入数据提交
create table lock1 (id number,name varchar(50));
insert into lock1 values(1,'aaaa');
insert into lock1 values(2,'bbbb');
create table lock2 (id number,name varchar(50));
insert into lock2 values(1,'ssss');
insert into lock2 values(3,'dddd');
commit;
执行下面更新语句,不要提交
update lock1 set name='sss' where id=1;
update lock2 set name='ss' where id=1;
打开新窗口,执行如下
打开另一个新窗口,执行如下
根据V$SQL_HISTORY可以查看想要的历史记录
通过v$lock视图查到当前数据库中锁的状态,如下可看到有两个事务114326,114327 被事务114320所阻塞
也可根据V$TRXWAIT 查找谁阻塞谁
根据v$trx可看到那些事务处于等待状态
根据V$sessions 和v$lock 查询产生阻塞的事务会话
select s.sess_id,s.SQL_TEXT,s.RUN_STATUS from v$sessions s , v$lock l where l.tid=s.trx_Id and l.blocked=1;
解决方案
1 如上所示查询出产生阻塞的事务会话id,只需要在该会话下提交或回滚事务,锁自然会被释放,阻塞解决
2 使用系统过程SP_CLOSE_SESSION(SESS_ID)来关闭对应的会话
select 'SP_CLOSE_SESSION(' ||s.sess_id||')' from v$sessions s,v$lock l where s.trx_id=l.tid and l.blocked=1;
执行会话之后,可以看到被阻塞的会话已经成功执行
SP_CLOSE_SESSION(2516820264)