oracle diag idle wait,oracle TX等待事件的解决方法

博客内容涉及数据库中出现的行级锁等待事件,通过查询数据库等待事件和使用特定SQL查询定位到引起冲突的会话。解决方案是通过杀死未提交更新的会话,从而解除锁定,确保第二个会话能正常提交。此方法适用于解决数据库并发更新时的锁问题。
摘要由CSDN通过智能技术生成

查询数据库等待事件:

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/,如需转载,请注明出处,否则将追究法律责任。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值