--创建测试表test1,test2
drop table if exists test1;
create table test1 (id number,name varchar(50));
insert into test1 values(1,'aa');
insert into test1 values(2,'bb');
drop table if exists test2;
create table test2 (id number,name varchar(50));
insert into test2 values(1,'cc');
insert into test2 values(2,'dd');
commit;
--更新表test1和test2的数据,不进行提交
update test1 set name='ss' where id=1;
update test2 set name='qq' where id=1;
--打开新窗口再次对test1和test2进行更新操作
update test1 set name='mm' where id=1;
update test2 set name='nn' where id=1;
--根据V$SQL_HISTORY可以查看想要的历史记录
select * from v$sql_history where top_sql_text like 'update%';
--通过v$lock视图查到当前数据库中锁的状态,如下可看到事务19136被事务19130所阻塞
select * from v$lock where blocked=1;
--也可根据V$TRXWAIT 查找谁阻塞谁
select * from v$trxwait;
--根据v$trx可看到那些事务处于等待状态
select * from v$trx where status='LOCK WAIT';
--根据v$sessions 和v$lock 查询产生阻塞的事务会话
select s.sess_id,s.SQL_TEXT,s.RUN_STATUS from v$sessions s,v$lock l where l.trx_id=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.trx_id and l.blocked=1;
SP_CLOSE_SESSION(140099283130296)
---------------------------------------------------------------------------------------------------------------------------------
关于达梦数据库更多的相关问题请浏览达梦云适配技术社区 达梦云适配技术社区 https://eco.dameng.com/