[20180907]访问v$视图与一致性读取.txt

来源:这里教程网 时间:2026-03-03 11:58:04 作者:

[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哪行信息.也就是一些动态视图不支持一致性读取的.

相关推荐