[20180907]訪問v$檢視與一致性讀取.txt

lfree發表於2018-09-08

[20180907]訪問v$檢視與一致性讀取.txt

--//前天看sql語句,發現應用存在一條訪問gv$session的語句,感到很奇怪.
--//v$之類的檢視,要訪問的一些基表實際上是x$,實際上是一些陣列或者連結串列之類的結構,只不過以表的形式展現出來.
--//這樣我思考一個問題,理論講就是一致性讀取的問題,透過例子說明:

1.環境:
--//開啟2個回話,sesson 1以scott使用者登陸,session 2以sys使用者登陸:
--//sesson 1:
SCOTT@test01p> @ ver1
PORT_STRING                    VERSION        BANNER                                                                               CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0           12.1.0.1.0     Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production              0

SCOTT@test01p> @ spid
       SID    SERIAL# PROCESS                  SERVER    SPID                     PID  P_SERIAL# C50
---------- ---------- ------------------------ --------- -------------------- ------- ---------- --------------------------------------------------
       152          9 5460:4376                DEDICATED 5564                      22          5 alter system kill session '152,9' immediate;

--//退出後再重新登陸,可以發現sid不變,至少在我的測試環境下能保證sid不變.

SCOTT@test01p> @ spid
       SID    SERIAL# PROCESS                  SERVER    SPID                     PID  P_SERIAL# C50
---------- ---------- ------------------------ --------- -------------------- ------- ---------- --------------------------------------------------
       152         11 2600:6116                DEDICATED 6060                      22          6 alter system kill session '152,11' immediate;


2.測試:
--//建立函式指令碼.
--//grant EXECUTE ON  dbms_lock to scott;
CREATE OR REPLACE FUNCTION SCOTT.sleep (seconds IN NUMBER)
   RETURN NUMBER
AS
BEGIN
   sys.DBMS_LOCK.sleep (seconds);
   RETURN seconds;
END;
/

--//session 1退出:
--//sesson 2:
SYS@test01p>  select count(*) from v$session where sid = 152;
  COUNT(*)
----------
         0
--//當前沒有sid=152的會話.
SYS@test01p> select scott.sleep(5),a.sid,a.serial#,module from v$session a where sid in(1,152) ;
--//等.

--//馬上切換到session 1登陸,如果輸入命令不夠塊,可以適當延長sleep的時間.^_^.
--//sesion 1:
SCOTT@test01p> @ spid
       SID    SERIAL# PROCESS                  SERVER    SPID                     PID  P_SERIAL# C50
---------- ---------- ------------------------ --------- -------------------- ------- ---------- --------------------------------------------------
       152         19 2132:6040                DEDICATED 5600                      22         21 alter system kill session '161,119' immediate;

--//切換會session 2檢視:
SYS@test01p> select scott.sleep(5),a.sid,a.serial#,module from v$session a where sid in(1,152) ;
SCOTT.SLEEP(5)        SID    SERIAL# MODULE
-------------- ---------- ---------- ------------
             5          1          1
             5        152         19 SQL*Plus

--//我查詢v$session在前,登入會話在後,可以發現顯示sid=152哪行資訊.也就是一些動態檢視不支援一致性讀取的.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2213824/,如需轉載,請註明出處,否則將追究法律責任。

相關文章