数据库发生锁等待时,我只能查到 等待锁的会话,所要执行的语句,但无法查看引起锁的会话执行了什么样的语句。
实验如下
(1)以aa用户登录
SQL> select sid from v$mystat where rownum=1;
SID
----------
145
aa用户下有表aa
SQL> select * from aa;
A1 A2
---------- ------------------------------
1 a
2 b
3 c
在这个会话中执行
update aa set a1=10 where a1=1;
(2)以另外一个aa重新登录
SQL> select sid from v$mystat where rownum=1;
SID
----------
142
在这个会话中执行 update aa set a1=20 where a1=1;
(3)因为都没有提交,所以出现了锁等待,以sys用户登录执行
SQL> select * from dba_waiters;
WAITING_SESSION HOLDING_SESSION LOCK_TYPE MODE_HELD MODE_REQUESTED LOCK_ID1 LOCK_ID2
--------------- --------------- -------------------------- ---------------------------------------- ---------------------------------------- ---------- ----------
142 145 Transaction Exclusive Exclusive 524291 392
可以看出 145 会话阻塞了 142 会话。
select a.waiting_session , b.username ,c.sql_text
from dba_waiters a , v$session b , v$sqlarea c
where a.waiting_session=b.sid
and b.sql_id=c.sql_id;
WAITING_SESSION USERNAME SQL_TEXT
--------------- ------------------------------ --------------------------------------------------------------------------------
142 AA update aa set a1=20 where a1=1
上面这条语句可以查找出,142 正在等待执行 update aa set a1=20 where a1=1;
select a.holding_session , b.username ,c.sql_text
from dba_waiters a , v$session b , v$sqlarea c
where a.holding_session=b.sid
and b.sql_id=c.sql_id;
select a.holding_session , b.username ,c.sql_text
from dba_waiters a , v$session b , v$sqlarea c
where a.holding_session=b.sid
and b.prev_sql_id=c.sql_id;
但是通过上面两条SQL都查不到 145 会话所执行的引起锁的SQL。
请大家指导一下,怎么查看145 会话所执行的引起锁的SQL