确定锁定问题将有助于定位正在等待其他某些用户或者某些东西的用户。可以使用这个策略来确定当
前被锁定在系统中的用户。这也使DBA 们可以确认一个相关的Oracle 进程是否真地被锁定了,还是仅仅运
行得比较慢。您还能够识别当前的语句是否正在执行锁定用户的操作。下面的程序清单提供了一个确定锁
定问题的示例。
select /*+ ordered */ b.username, b.serial#, d.id1, a.sql_text
from v$lock d, v$session b, v$sqltext a
where b.lockwait = d.kaddr
and a.address = b.sql_address
305
and a.hash_value = b.sql_hash_value;
USERNAME SERIAL# ID1 SQL_TEXT
-------- ---------- ----------- -----------------------------
AUTHUSER 53 393242 update emp set salary = 5000
您还需要识别在系统中是哪个用户造成了前一个用户被锁定的问题,如下面程序清单所示(通常情况
下,这是因为当您靠近用户/开发人员的桌子时,他/她按下了CTRL-ALT-DEL 而引起的问题)。
select /*+ ordered */ a.serial#, a.sid, a.username, b.id1, c.sql_text
from v$lock b, v$session a, v$sqltext c
where b.id1 in
(select /*+ ordered */ distinct e.id1
from v$lock e, v$session d
where d.lockwait = e.kaddr)
and a.sid = b.sid
and c.hash_value = a.sql_hash_value
and b.request = 0;
SERIAL# SID USERNAME ID1 SQL_TEXT
------- --- -------- ------ -------------------------------------------
18 11 JOHNSON 393242 update authuser.emp set salary=90000
在上面的程序清单中,JOHNSON 如果忘记了写至关紧要的WHERE 子句的话,就皆大欢喜了。但是,
JOHNSON 锁定了这张表的授权用户。
也可以详细查看锁定,确切了解运行和中断情况。在第9 章,我们介绍了代码块级调整;还描述了其
中某些列,也执行了一些对V$TRANSACTION 的查询(它显示所有最近运行的DML [update/insert/delete]
事务)。下面的程序清单中,有4 个在相同信息块上同时运行的事务。这里没有有中断,因为initrans 设
置为同时处理相同代码块内的4 个变更(至少设置为4 ITL 槽)。如果有问题, 在下面第3 个查询中LMODE
应该是0,REQUEST 应该是6 (TX6)。
4 位用户更新相同代码块中的不同行:
select /*+ ordered */ username, v$lock.sid, trunc(id1/power(2,16)) rbs,
bitand(id1,to_number('ffff','xxxx'))+0 slot,
id2 seq, lmode, request
from v$lock, v$session
where v$lock.type = 'TX'
and v$lock.sid = v$session.sid;
USERNAME SID RBS SLOT SEQ LMODE REQUEST
-------- ------ -------- ------- ------- ------ -------
SCOTT 146 6 32 85 6 0
SCOTT 150 4 39 21557 6 0
SCOTT 151 5 34 1510 6 0
SCOTT 161 7 24 44 6 0
select xid, xidusn, xidslot, xidsqn, status, start_scn
from v$transaction
order by start_scn;
306
XID XIDUSN XIDSLOT XIDSQN STATUS START_SCN
---------------- ------- ------- ------- ---------------- ----------
0600200055000000 6 32 85 ACTIVE 16573480
0400270035540000 4 39 21557 ACTIVE 16573506
05002200E6050000 5 34 1510 ACTIVE 16573545
070018002C000000 7 24 44 ACTIVE 16574420
3 位用户试图更新相同的行:
select /*+ ordered */ username, v$lock.sid, trunc(id1/power(2,16)) rbs,
bitand(id1,to_number('ffff','xxxx'))+0 slot,
id2 seq, lmode, request
from v$lock, v$session
where v$lock.type = 'TX'
and v$lock.sid = v$session.sid;
USERNAME SID RBS SLOT SEQ LMODE REQUEST
---------- ------ ----- ------ ---------- ---------- ----------
SCOTT 146 4 47 21557 0 6
SCOTT 150 4 47 21557 6 0
SCOTT 161 4 47 21557 0 6
select xid, xidusn, xidslot, xidsqn, status, start_scn
from v$transaction
order by start_scn;
XID XIDUSN XIDSLOT XIDSQN STATUS START_SCN
---------------- ------- -------- ---------- ---------------- ----------
04002F0035540000 4 47 21557 ACTIVE 16575501
阻止了两个用户:
SELECT sid, blocking_session, username, blocking_session_status
FROM v$session
WHERE username='SCOTT'
ORDER BY blocking_session;
SID BLOCKING_SESSION USERNAME BLOCKING_SESSION_STATUS
------- ---------------- ---------- -----------------------
146 150 SCOTT VALID
161 150 SCOTT VALID
150 SCOTT NO HOLDER
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25198367/viewspace-707598/
,如需转载,请注明出处,否则将追究法律责任。