oracle TX等待事件的解决方法

查询数据库等待事件:


EVENT   COUNT(*)
---------------------------------------------------------------- ----------
SQL*Net message from client  1
heartbeat redo informer  1
pmon timer  1
Streams AQ: qmn slave idle wait  1
Streams AQ: waiting for time management or cleanup tasks  1
Streams AQ: qmn coordinator idle wait  1
smon timer  1
lreg timer  1
SQL*Net message to client  1
VKTM Logical Idle Wait  1
AQPC idle  1
DIAG idle wait  2
Space Manager: slave idle wait 10
rdbms ipc message 17


14 rows selected.

现有表a;
SQL> select * from a;


ID NAME
---------- ----------
2 a


SQL> 

session1:--执行不提交
update a set id=1 where id=2;
SQL> update a set id=1 where id=2;


1 row updated.


SQL> 

session2:--hang住
  update a set id=3 where id=2;
SQL> 
SQL> update a set id=3 where id=2;

 查询数据库等待事件:
EVENT   COUNT(*)
---------------------------------------------------------------- ----------
enq: TX - row lock contention  1
Streams AQ: waiting for time management or cleanup tasks  1
Streams AQ: qmn coordinator idle wait  1
AQPC idle  1
heartbeat redo informer  1
pmon timer  1
smon timer  1
lreg timer  1
Streams AQ: qmn slave idle wait  1
SQL*Net message to client  1
VKTM Logical Idle Wait  1
DIAG idle wait  2
SQL*Net message from client  2
Space Manager: slave idle wait 10
rdbms ipc message 17


15 rows selected.


分析:比之前多了tx等待事件,行级锁

解决:
个人写的sql,觉得很好用,特此分享:
select  l.session_id, s.SERIAL#,o.object_name,s.PREV_SQL_ID,pr.SPID
  from v$session s,v$locked_object l, dba_lock lo,dba_objects o,v$process pr
 where l.session_id = s.SID
 and lo.session_id=l.SESSION_ID
 and lo.blocking_others not in ('Not Blocking')
 and pr.ADDR=s.PADDR
 and o.object_id=l.OBJECT_ID


或者


 select se.sid, se.SERIAL#,lo.type,lo.ctime
  from v$lock lo, v$session se
 where lo.sid = se.sid
   and lo.block = 1 

SQL> /


SESSION_ID    SERIAL# OBJECT_NAME       PREV_SQL_ID   SPID
---------- ---------- -------------------------------------------------------------------------------------------------------------------------------- ------------- ------------------------
74  839 A

然后kill session,先不急着kill,考虑下kill的是哪个?没错,肯定是第一条执行未提交的,第二个session成功提交。kill验证

alter system kill session ' 74 ,839';
SQL> alter system kill session '74,839';


System altered.


SQL> 
第二个窗口:
SQL> update a set id=3 where id=2;


1 row updated.


SQL> commit;


Commit complete.


SQL> 

第一个窗口:
SQL> /
update a set id=1 where id=2
*
ERROR at line 1:
ORA-00028: your session has been killed




SQL> 

成功kill源头,完美解决。哈哈哈,下午没白搞

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30536096/viewspace-1991398/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30536096/viewspace-1991398/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值