如何找到引起TX锁的语句?

需要通过v$open_cursor视图找到语句:

select w.holding_session, s1.username holding_user, q1.sql_text holding_sql
from dba_waiters w,
v$session s1,
v$open_cursor q1,
v$locked_object l1,
dba_objects o1
where w.holding_session = s1.sid
and s1.sid = q1.sid(+)
and l1.session_id = s1.sid
and l1.object_id = o1.object_id
and (upper(q1.sql_text) like '%DELETE%' or
upper(q1.sql_text) like '%UPDATE%')
and upper(q1.sql_text) like '%' || o1.object_name || '%';

这一查询结果可能会存在多条记录,需要结合等待会话的语句,从逻辑上分析是哪一条语句产生的锁。

可以通过下面的语句找到发生等待的具体数据记录(假定等待锁的会话ID为13):

select s.sid,
o.object_name wait_object,
s.row_wait_obj#,
s.row_wait_file#,
s.row_wait_block#,
s.row_wait_row#,
dbms_rowid.rowid_create(1,
s.row_wait_obj#,
s.row_wait_file#,
s.row_wait_block#,
s.row_wait_row#) l_rowid
from v$session s, v$enqueue_lock l, dba_objects o
where s.sid = l.sid
and s.row_wait_obj# = o.object_id(+)
and s.sid = 13;

然后通过查询到的对象和ROWID找到相关数据(假定被锁住的对象是TEST,rowid是AAAHbvAAJAAAA/YAAA):

select * from test where rowid = chartorowid('AAAHbvAAJAAAA/YAAA');

[@more@]
请使用浏览器的分享功能分享到微信等