在写 Oracle session相关数据字典(一) 这篇文章时,提到使用v$session视图的树形查询可以得到Oracle锁树,这样就便于我们找出阻塞会话的源头,但是仅仅可以在单机环境中使用。今天把单机和RAC的阻塞树都整理了一下,话不多说,直接开干,奥利给。
(一)单机的阻塞会话树
单机的不再测试,直接搬以前的记录。EM里面的Blocking session里面看到下图,以折叠图的形式展现,最上面的代表正在阻塞其它session的会话,研究了一下,可以使用v$session来得到类似的效果。
图1.blocking session树形图
我们来做一次测试,对表test01和test02进行DML操作,观察运行情况,操作如下
(1)创建测试表test01,test02。并在2个表的id列添加主键约束
test01表 test02表
(2)对2个表进行操作,执行顺序如下
----------------------------------------test01操作-------------------------------------------------------
[sessid:27 ] delete from test01; --删除test01整个表的数据,未提交,阻塞源头
[sessid:28 ] update test01 set name = 'aaa' where id = 1; --更新test01表id=1的行,会话产生等待
[sessid:142] insert into test01 values(1,'abc'); --插入test01表id=1的行,会话产生等待
[sessid:25 ] delete from test01 where id = 2; --删除test01表id=2的行,会话产生等待
[sessid:29 ] update test01 set name = 'bbb' where id = 2; --更新test01表id=2的行,会话产生等待
-----------------------------------------test02操作--------------------------------------------------------
[sessid:30 ] insert into test02 values(3,'augly',3000); --插入test02表id=3的行,未提交,阻塞源头
[sessid:23 ] insert into test02 values(3,3300); --插入test02表id=3的行,会话产生等待
此时我们到EM里面观察,就会发现图1的blocking session树形图。
在实际环境中,大部分系统是没有安装EM的,在没有EM的情况下,我们依然可以通过v$session得到类似的图形
@H_404_44@--使用v$session来查看单实例的阻塞session信息 @H_403_50@SELECT LPAD(' ',5*(LEVEL-1))||S."USERNAME" AS user_name,LPAD(||S."SID" AS session_id,S."SERIAL#",S."sql_ID",S."ROW_WAIT_OBJ#",S."WAIT_CLASS",S."EVENT",S."P1",S."P2",S."P3",S."SECONDS_IN_WAIT" FROM V$SESSION S WHERE S."BLOCKING_SESSION" IS NOT NULL OR S.SID IN(SELECT DISTINCT BLOCKING_SESSION V$SESSION) START WITH S."BLOCKING_SESSION" IS NULL CONNECT BY PRIOR S."SID" = S."BLOCKING_SESSION";