这一类锁是代码逻辑造成的——第一个获取锁的事务没有提交或回滚,导致其他会话等待。因此,找到逻辑代码是解决此类锁等待的关键。对于等待事务,由于其语句被锁阻塞住,因此从V$SESSION中得到的SQL信息就是其当前正在执行的语句,也就是发生等待的语句:www.Examda.CoM考试就到考试大
HELLODBA.COM> select w.waiting_session,
2 s2.username waiting_user,
3 q2.sql_text waiting_sql
4 from dba_waiters w,
5 v$session s2,
6 v$sqlarea q2
7 where w.waiting_session = s2.sid
8 and s2.sql_address = q2.address;
WAITING_SESSION WAITING_USER WAITING_SQL
--------------- ------------------------------ ---------------------------------------------
127 DEMO delete from tx_lock_tab where a=100
对于持有锁的会话,由于其在申请到锁资源后还可能会执行其他语句,因此不能通过v$session直接查询到发生锁的语句,而需要通过v$open_cursor来找到该语句:
HELLODBA.COM> select w.holding_session,
2 s1.username holding_user,
3 q1.sql_text holding_sql
4 from dba_waiters w,
5 v$session s1,
6 v$open_cursor q1,
7 v$locked_object l1,
8 dba_objects o1
9 where w.holding_session = s1.sid
10 and s1.sid = q1.sid(+)
11 and l1.session_id = s1.sid
12 and l1.object_id = o1.object_id
13 and (upper(q1.sql_text) like 'ÞLETE%' or upper(q1.sql_text) like '%UPDATE%')
14 and upper(q1.sql_text) like '%'||o1.object_name||'%';
HOLDING_SESSION HOLDING_USER HOLDING_SQL
--------------- ------------------------------ ------------------------------------------------------------
129 DEMO delete from tx_lock_tab where a=100
这一查询结果可能会存在多条记录,那我们就需要结合等待会话的语句,从逻辑上分析是哪一条语句产生的锁。
除了语句,我们还可以通过会话信息中找到发生等待的具体数据记录:
HELLODBA.COM> select s.sid, o.object_name wait_object
2 s.row_wait_obj#,
3 s.row_wait_file#,
4 s.row_wait_block#,
5 s.row_wait_row#,
6 dbms_rowid.rowid_create(1,
7 s.row_wait_obj#,
8 s.row_wait_file#,
9 s.row_wait_block#,
10 s.row_wait_row#) l_rowid
11 from v$session s, v$enqueue_lock l, dba_objects o
12 where s.sid = l.sid and s.row_wait_obj# = o.object_id(+)
13 and s.sid = 127;
SID WAIT_OBJECT ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW# L_ROWID
---------- ----------- ------------- -------------- --------------- ------------- ------------------
127 TX_LOCK_TAB 198074 5 67366 1 AAAwW6AAFAAAQcmAAB
责任编辑:小草