一次遇到一个表锁住了,导致对这个表的子表做相关的操作也被锁住的情况,但是当时只能查询到子表对应的sql的sess_id,找不到父表锁住的sql对应的sess_id,后来在付总等的帮助下成功解决了问题,下面把方法描述下。
1、先select count(*) from v$lock where lmode = 'X' and table_id <> 0; 看看多不多,如果很多的话就要分开分析。
a、知道被锁住的表,从sysobjects里面找到对应的table_id,select id from sysobjects where name = '锁住表的表名';
select trx_id,ltype,lmode,table_id from v$lock where table_id=锁住表的id;
然后到v$sessions中找出对应的sess_id,select * from v$sessions where trx_id = trx1;(trx1上面的sql查询出来的事务ID);
然后执行sp_close_session(sess_id);即可。(注意确认能否杀)
b、不知道被锁住的表,这个可以根据table_id找出阻塞的sql。
with locks as(
select o.name,l.*,s.sess_id,s.sql_text,s.clnt_ip
from v$lock l,sysobjects o,v$sessions s
where l.table_id=o.id and l.trx_id=s.trx_id ),
lock_tr as (