ITPub博客

首页 > 数据库 > Oracle > V$SESSION记录的BLOCKING_SESSION错误

V$SESSION记录的BLOCKING_SESSION错误

原创 Oracle 作者:yangtingkun 时间:2012-11-26 23:41:54 0 删除 编辑

记录一个很诡异的问题,在进行一个测试时碰到的,V$SESSION中记录的BLOCKING_SESSION信息是错误的,可惜这个问题当时没有注意,后续也无法再重现出来,只好作为一个现象记录一下,Oracle给出的一些信息看来也是不完全可信的。

[@more@]

在会话1执行:

[tingkun.yang@node1 ~]$ sqlplus test/test

SQL*Plus: Release 10.2.0.5.0 - Production on Sun Nov 25 04:04:00 2012

Copyright (c) 1982, 2010, Oracle. All Rights Reserved.

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options

SQL> set pages 100 lines 140
SQL> create table t_lock (id number, name varchar2(30), gender varchar2(8));

Table created.

SQL> insert into t_lock values (1, 'a', 'm');

1 row created.

SQL> insert into t_lock values (2, 'b', 'f');

1 row created.

SQL> commit;

Commit complete.

SQL> update t_lock set name = 'c' where id = 1;

1 row updated.

SQL> select sid from v$mystat where rownum = 1;

SID
----------
151

在会话2执行同一行的更新,被锁定:

[tingkun.yang@node1 ~]$ sqlplus test/test

SQL*Plus: Release 10.2.0.5.0 - Production on Sun Nov 25 04:03:27 2012

Copyright (c) 1982, 2010, Oracle. All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options

SQL> set pages 100 lines 120
SQL> update t_lock set name = 'd' where id = 1;

在会话3上执行对V$SESSION的查询,当时没有太注意:

SQL> conn / as sysdba
Connected.
SQL> select sid, event, blocking_session from v$session where usernamE = 'TEST';

SID EVENT BLOCKING_SESSION
---------- ---------------------------------------------------------------- ----------------
131 SQL*Net message from client
151 SQL*Net message from client

SQL> select sid, event, blocking_session from v$session where usernamE = 'TEST';

SID EVENT BLOCKING_SESSION
---------- ---------------------------------------------------------------- ----------------
131 enq: TX - row lock contention 161
151 SQL*Net message from client

随后在会话1执行了ROLLBACK

SQL> roll;

Rollback complete.

检查了会话2的连接信息:

1 row updated.

SQL> select sid from v$mystat where rownum = 1;

SID
----------
131

这时才发现,之前查询的V$SESSION中的BLOCKING_SESSION信息是错误的。当前数据库只有两个测试会话,分别是131151,而BLOCKING_SESSION给出的结果居然是161。虽然V$SESSION中还有BLOCKING_SESSION_STATUS列来表示当前的BLOCKING_SESSION是否有意义,但是一般而言,如果BLOCKING_SESSION_STATUS的值不是VALID,那么BLOCKING_SESSION的值会是NULL,但是像这种值本身就是错误的,还是第一次碰到。

由于没有办法重现,现在确定不了Oracle为什么会出现这种问题,只能先作为一个异常案例记录一下,如果以后发现类似的错误,再进行分析。不过这提示一点,Oracle视图的返回结果经常作为我们诊断、分析问题的依据,但是如果结果本身不可信,那么在此基础上推导出来的结果很可能也是不可信的。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-1060813/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1955
  • 访问量
    10454797