V$SESSION記錄的BLOCKING_SESSION錯誤

yangtingkun發表於2012-11-26

記錄一個很詭異的問題,在進行一個測試時碰到的,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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章