2008年6月20日 星期五

check uncommitted sessions using Oracle10g

建測試table

create table testlk
(
  col1 integer
);

新增測試資料

insert into testlb select level from dual connect by level <= 500;

Session 1)以user:Orion登入刪資料

SQL>connect orion/orion
SQL>delete from testlk where col1 = 8;
已刪除1個資料列.


Session 2)以user:pisces登入

SQL>connect pisces/pisces

Session 2)刪同一筆資料結果被block住

SQL>delete from testlk where col1 = 8;

Session 3)以user:taurus登入

SQL>connect taurus/taurus

Session 3)刪另一筆資料

SQL>delete from testlk where col1 = 9;
已刪除1個資料列.
SQL>commit;


Session 4)以sysdba登入檢查是否有session被block住

將以下程式存成.sql檔,ex:c:\uncommit.sql
(reference=> http://www.praetoriate.com/oracle_tips_find_locks.htm):


set pagesize 200
set linesize 200
column owner format a10
column object_name format a10
column username format a10
column object_type format a10
column osuser format a30
column machine format a30

spool c:\1.log

select c.owner,c.object_name,c.object_type,
b.sid,b.serial#,b.username,b.blocking_session,b.status,b.osuser,
b.machine
from v$locked_object a ,v$session b,
dba_objects c
where b.sid = a.session_id
and a.object_id = c.object_id
/
spool off

執行uncommit.sql

SQL>@c:\uncommit.sql

開啟 1.log內容如下

OWNER OBJECT_NAM OBJECT_TYP SID SERIAL# USERNAME BLOCKING_SESSION STATUS OSUSER MACHINE
----- ---------- ---------- ---------- ---------- ---------- ---------------- ---------------- ------------------------------ --------
ORION TESTLK    TABLE    156  256   PISCES   143     ACTIVE  IBM-63AB93AA2BF\orion  WORKGROUP\IBM-63AB93AA2BF
ORION TESTLK    TABLE    143  71    ORION        INACTIVE IBM-63AB93AA2BF\orion  WORKGROUP\IBM-63AB93AA2BF

另外,也可以使用DBA_BLOCKERS來查看誰block住別人
以pisces登入刪資料

SQL>delete from testlk where col1 = 95;
已刪除 1 個資料列.

再以taurus登入刪同一筆資料

SQL>delete from testlk where col1 = 95;

以sys登入查誰block住別人

SQL>select * from dba_blockers;
HOLDING_SESSION
---------------
150

SQL>select username,program from v$session where sid = 150;
USERNAME   PROGRAM
----------- -----------------
PISCES    sqlplus.exe

如DBA_BLOCKERS不存在,則需先執行%ORACLE_HOME%\rdbms\admin\Catblock.sql產生之