执行超时会话时,同时执行一个报锁超时的sql
for rec in (select sess_id,
SF_GET_EP_SEQNO(ROWID) a
from v$sessions
where trx_id in (select wait_for_id from v$trxwait)
and port_type=0)
loop
sp_close_session(rec.a,rec.sess_id);
end loop;
end;
:::
:::
:::
如果上面的不行再试试这个
执行超时会话时,同时执行一个报锁超时的sql
select
tw.id as "等待的事务ID",
tw.wait_for_id as "正在运行的事务ID",
s.sess_id as "等待的会话",
ws.sess_id as "正在执行的会话",
s.sql_text as "等待的sql",
ws.sql_text as "正在执行的sql" ,
'SP_CLOSE_SESSION('||ws.sess_id||');' "关闭会话的语句"
from v$trxwait tw left join v$sessions s
on tw.id=s.trx_id
left join v$sessions ws
on tw.wait_for_id=ws.trx_id where s.port_type=0;
其他查询方式
(1)查询delete语句和会话的状态:并查看该delete语句对应的TRX_ID,例如为20187
SELECT * FROM v$sessions where sql_text like ‘delete%t1%’;
(2)查询20187这个事务被哪个事务锁定:查询出产生锁的事务ID,例如为20194
SELECT * FROM v$trxwait WHERE id = 20187;
行号 ID WAIT_FOR_ID WAIT_TIME THRD_ID
1 20187 20194 221348 8880
(3)查询20194这个事务对应的SESS_ID:检查该session的SQL语句是否为业务语句,如果可以停掉在将该会话CLOSE
SELECT * FROM v$trxwait WHERE id = 20194;
159793176这个SESS_ID是20194的SESS_ID
CALL SP_CLOSE_SESSION(159793176);
文章
阅读量
获赞