[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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/267265/viewspace-2213824/