oracle学习笔记 锁相关视图及相关操作

Posted 新站

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle学习笔记 锁相关视图及相关操作相关的知识,希望对你有一定的参考价值。

oracle学习笔记 锁相关视图及相关操作

我们继续研究锁
这节课主要研究锁的相关视图,以及锁的相关操作

主要是研究视图
然后通过视图查锁的问题
oracle对于锁来讲我们没有什么太多可操作的地方
但是我们可以通过视图找出锁的问题

一)v$transaction视图

第一个视图是v$transaction
就是oracle数据库所有活动的事务数
所有活动的事务每一个活动的事务在这里有一行

    v$transaction
    XIDUSN表示当前事务使用的回滚段的编号
    XIDSLOT说明该事务在回滚段头部的事务表中对应的记录编号(也可以叫做槽号)
    XIDSQN说明序列号
    STATUS说明该事务是否为活动的

这是v$transaction视图的结构

我们去看一下,比如说去做一个实验

在一个hr用户的sqlplus中执行

SQL> delete from employees where rownum=1;

1 row deleted.

我删一行,开始一个事务
可以查一下

以管理员身份运行,去执行一下
select xidusn,xidslot,xidsqn,status from v$transaction;
看看有几个事务

结果:

SQL> select xidusn,xidslot,xidsqn,status from v$transaction;

    XIDUSN    XIDSLOT     XIDSQN STATUS
---------- ---------- ---------- ----------------
         4         43        216 ACTIVE

一个事务在这里面有一行

XIDUSN是事务使用的回滚段的编号
XIDSLOT是哪个槽位数
XIDSQN是覆盖多少次
这三个唯一的标示一个事务的编号

STATUS是当前事务的状态
这个事务为ACTIVE

这是v$transaction
所有的活动事务里面都有

二)v$lock视图

v$lock
    记录了session已经获得的锁定以及正在请求的锁定的信息
    SID说明session的ID号
    TYPE说明锁的类型,主要关注TX和TM
    LMODE说明已经获得的锁定的模式,以数字编码表示
    REQUEST说明正在请求的锁定的模式,以数字编码表示
    BLOCK说明是否阻止了其他用户获得锁定,大于0说明是,等于0说明否

v$lock这里面
记录了session已经获得的锁定以及正在请求的锁定的信息

就是每个会话
它已经获取的锁和正在申请的锁它都会列出来

这里面我们去查一下

上面执行了
delete from employees where rownum=1;

一个事务开始以后至少产生几个锁

第一个行上加锁了
行上的锁你是看不见的,因为它在行上
但是我们开始一个事务有一个事务锁
同时在表上应该加了个RX锁

应该这时候有两个锁
一个TX锁事务锁
一个是TM级别上的表级的RX锁

去查一下,v$lock里面应该有

使用语句

select sid,type,id1,id2,
    decode(lmode,0,'None',1,'Null',2,'Row share',3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive') lock_mode,  
  decode(request,0,'None',1,'Null',2,'Row share',3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive') request_mode,block
    from v$lock
    where sid=129;

这个语句本课中用的较多,这里把它取名为(#A)语句

最后where条件有sid
sid是会话的编号

先查一下我们会话的编号是多少

在我的实验环境下
在hr用户的sqlplus中

SQL> select sid from v$mystat where rownum=1;
select sid from v$mystat where rownum=1
                *
ERROR at line 1:
ORA-00942: table or view does not exist

hr用户无权访问v$mystat
所以换个方法
使用下面的命令得到hr用户当前的sid

SQL> select userenv('sid') from dual;

USERENV('SID')
--------------
           132

得到SID是132

然后用132替换前面(#A)语句where条件下的sid的值
然后在管理员用户下查一下
因为hr用户依然无法访问v$lock

执行结果

SQL> select sid,type,id1,id2,decode(lmode,0,'None',1,'Null',2,'Row share',3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive') lock_mode,
decode(request,0,'None',1,'Null',2,'Row share',3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive') request_mode,block
  2    3        from v$lock
  4     where sid=132;

       SID TY        ID1        ID2 LOCK_MODE           REQUEST_MODE             BLOCK
---------- -- ---------- ---------- ------------------- ------------------- ----------
       132 TM      51852          0 Row share           None                         0
       132 TM      51855          0 Row share           None                         0
       132 TM      51857          0 Row Exclusive       None                         0
       132 TM      51864          0 Row share           None                         0
       132 TM      51871          0 Row share           None                         0
       132 TM      51889          0 Row share           None                         0
       132 TM      51894          0 Row share           None                         0
       132 TM      51902          0 Row share           None                         0
       132 TX     262187        216 Exclusive           None                         0

9 rows selected.

我们看一下132这个会话在很多的表上产生了TM锁

132这个会话至少底下产生了一个TX锁
同时132产生了TM锁

LOCK_MODE中是Row share说明是RS锁
是select for update产生的锁

132这个会话产生的TM锁的ID1列的ID数
这个TM在某个表上产生的锁,ID1就是这个表的编号

有一个是51902
我们可以根据51902查出来
select object_name from dba_objects where object_id=51902;
查出51902是哪个表

执行结果

SQL> select object_name from dba_objects where object_id=51902;

OBJECT_NAME
-------------------------------------------------------------------------------------------------------
PRODUCT_INFORMATION

对象编号51902是PRODUCT_INFORMATION表
说明我们找错了
这个表上加的锁是Row share类型的锁
删除操作的表应该产生Row Exclusive类型的锁
前面delete语句删除EMPLOYEES表中行时牵涉到了PRODUCT_INFORMATION这个表
是主外键约束关系的原因在PRODUCT_INFORMATION表产生了RS锁

再看刚才的结果
应该是这一行

       132 TM      51857          0 Row Exclusive       None                         0

锁应该是RX锁,TM级别的RX锁
应该是51857

把语句改为
select object_name from dba_objects where object_id=51857;
改一下,执行一下,看一下

SQL> select object_name from dba_objects where object_id=51857;

OBJECT_NAME
----------------------------------------------------------------------------------------------------
EMPLOYEES

结果是EMPLOYEES,是对的

所以说记住
这个TM这个表级锁在哪个表上
根据ID1对应的ID可以找出来

另外结果中TX所在的行
有ID1对应的ID和ID2列对应的ID
ID1和ID2这两个数字标示着
这个事务用的那个回滚段、事务表里面的槽位号还有覆盖次数
我们可以通过一个sql语句查出来

将ID1拆解
select trunc(393249/power(2,16)) as undo_blk#,bitand(393249,to_number('ffff','xxxx')) + 0 as slot#
from dual;

刚才delete语句产生的TX锁是这一行
132 TX 262187 216 Exclusive None 0
ID1列的值262187替换上面的语句中的值393249
得到
select trunc(262187/power(2,16)) as undo_blk#,bitand(262187,to_number(‘ffff’,’xxxx’)) + 0 as slot#
from dual;

执行一下

SQL> select trunc(262187/power(2,16)) as undo_blk#,bitand(262187,to_number('ffff','xxxx')) + 0 as slot#
        from dual;  2

 UNDO_BLK#      SLOT#
---------- ----------
         4         43

看结果是4号回滚段,回滚段事务表中槽位号SLOT#是43

和以前查询

SQL> select xidusn,xidslot,xidsqn,status from v$transaction;

    XIDUSN    XIDSLOT     XIDSQN STATUS
---------- ---------- ---------- ----------------
         4         43        216 ACTIVE

结果是一样的

刚才这个语句XIDSQN的值216
(#A)语句结果行

132 TX     262187        216 Exclusive           None                         0

直接有了

(#A)语句结果中ID2是覆盖次数

通过
select trunc(262187/power(2,16)) as undo_blk#,bitand(262187,to_number(‘ffff’,’xxxx’)) + 0 as slot#
from dual; 2
这个sql语句
找出来用的哪个回滚段
槽位号是多少
然后包括覆盖次数
这三个信息

也就是(#A)语句结果中TX这一行
ID1列和ID2列可以找到哪个事务


132 TM 51857 0 Row Exclusive None 0
是TM锁
ID1对应的编号51857是对象的编号

这是v$lock

oracle中的表级锁有

锁定模式锁定简称编码数值
Row ExclusiveRX3
Row SharedRS2
ShareS4
ExclusiveX6
Share Row ExclusiveSRX5
NULLN/A0或者1

这是锁的一些编号
v$lock视图里面是用编号给列出来了
如编号3对应Row Exclusive锁模式

并且v$lock持有锁和申请锁的都列出来了

我们查询以后得出的结论
SID为132的LOCK_MODE它是持有锁的模式

(#A)结果中SID为132的行有9行
它是持有这么多的锁
REQUEST_MODE都是None
请求这块是none

我们看(#A)结果中这些列
SID是session id
Type是类型
有表级锁TM和事务锁TX
对于ID
对TM来讲ID1是哪个对象
对于TX来讲ID1和ID2分别对应哪个事务

LOCK_MODE是SID会话持有的锁
它持有这个锁

REQUEST_MODE这个是请求什么锁
这里我请求都是None
没有请求任何锁

同时
BLOCK这个数字是0或者1

这个0表示
比如说SID为132的会话持有LOCK_MODE为Row share的锁
这个锁并没有把其它的别人锁住,BLOCK就为0

BLOCK如果是1的话
132持有这个锁同时还锁住了别人
到底锁住了谁可以去查
BLOCK是这个意思

这里结果中block都是0
也就是对132来讲
我持有这么多的锁
但是没有锁其它的任何人

也就是132持有的锁没有对别人造成影响

三)v$enqueue_lock视图

v$enqueue_lock
该视图中包含的字段以及字段含义与v$lock中的字段一模一样。
只不过该视图中只显示那些申请锁定,但是无法获得锁定的session信息。
其中的记录按照申请锁定的时间先后顺序排列,先申请锁定的session排在前面,排在前面的session将会先获得锁定。

我们接着看v$enqueue_lock

v lockv enqueue_lock只是把请求锁的都列出来了

v$enqueue_lock只是把哪些会话它正在请求锁
它把请求的列出来了
它持有锁它没列

因为对我们来讲
有时候我们只关心谁在请求锁
因为请求锁就有可能被锁住
但有时候我们并不关心持有锁

四)v$locked_object视图

v$locked_object
记录了当前已经被锁定的对象的信息
XIDUSN表示当前事务使用的回滚段的编号
XIDSLOT说明该事务在回滚段头部的事务表中对应的记录编号
XIDSQN说明序列号
OBJECT_ID说明当前被锁定的对象的ID号,可以根据该ID号到dba_objects里查找被锁定的对象名称
LOCKED_MODE说明锁定模式的数字编码

v$locked_object
记录了当前已经被锁定的对象的信息
哪些对象被锁定了

XIDUSN、XIDSLOT、XIDSQN是锁这些对象的事务信息
OBJECT_ID是哪个对象被锁住了
LOCKED_MODE是锁的模式是什么,用什么方式锁了

比如某个表被锁住的话
这里面可以查出来

五)v$session视图

v$session
记录了当前session的相关信息
SID表示session的编号
SERIAL#表示序列号
SID和SERIAL#可以认为是v$session的主键,它们共同唯一标识一个session

记录的是会话信息
通过SID和SERIAL#
它俩可以唯一的标示一个会话

六)选择hr用户做实验

1)hr用户

在sqldeveloper里面开的会话有的是用hr用户登陆的

sqldeveloper打开后
在 连接 设置卡部分

选择其中的一个连接
右键点击连接名

再点击右键菜单中的属性
打开 新建/选择数据库连接 设置卡

将其中的 用户名和口令 改成你需要的用户
我们使用hr做的测试,这里用hr

这个sqldeveloper就是使用hr用户
也可以在sqldeveloper中使用sys用户

老师使用的sqlplus里面都是用hr用户登的

hr用户它默认不能访问v$mystat
这个视图要经常被使用

可以使用下面的命令
grant select on v_$mystat to hr;
以管理员身份运行,给hr用户授权

在sys用户里面执行一下

SQL> grant select on v_$mystat to hr;

Grant succeeded.

执行以后这个hr用户就可以访问v$mystat了

我们看一下比如这个
select sid from v$mystat where rownum=1;

看看会话的当前的SID是多少

如果grant没有执行的话
hr用户使用这个语句查询它会报错的
它会报没有这个对象
去grant一下以后它就ok了
所以你需要用sys用户grant一下

在sqldeveloper中
一个hr用户建立的连接返回了一个结果

       SID
       134

当前的SID是134

我们看看第二个hr用户建立的会话

       SID
       131

老师执行时返回结果慢
在sqldeveloper执行慢主要和sqldeveloper的原理有关系
当一个会话长时间不用的时候它会关掉
sqldeveloper确实非常占资源
我们现在开了三个所以非常的慢了

在sqlplus中也可以查
这个比较的快

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

       SID
----------
       139

这个hr用户会话的SID是139

在另一个sqlplus中查

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

       SID
----------
       145

这个hr用户会话的SID是145

好我们记一下
134,131
第三个sqldeveloper不用
第四个是sqlplus是139
第五个sqlplus是145

hr用户一共建了了四个会话
SID分别是134,131,139,145

最终老师放弃了使用sqldeveloper做hr用户的实验
后面的实验只使用了前面hr会话中的139和145的两个会话

2)v_$mystat和v$mystat

可能大家注意到了
grant语句中使用的v_$mystat和hr用户访问的v$mystat不一样

这里补充说一下 v$mystat 和 v_$mystat 的区别

初始状态下hr用户访问v$mystat时

SQL> select sid from v$mystat where rownum=1;
select sid from v$mystat where rownum=1
                *
ERROR at line 1:
ORA-00942: table or view does not exist

提示访问的表或者视图不存在

当sys用户给hr用户授权后
grant select on v_$mystat to hr;
hr用户就可以访问了

大家注意到上面两个语句中执行的对象并不一样
要访问的是v$mystat,而授权的是v_$mystat

如果我们直接给v$mystat授权

SQL> grant select on v$mystat to hr;
grant select on v$mystat to hr
                *
ERROR at line 1:
ORA-02030: can only select from fixed tables/views

说明这里授权的v$mystat不是固有视图,不能直接授权

实际这里hr访问的v$mystat是一个同义词
sys不能给同义词授权,只能授权给固定的表或视图

同义词在oracle中可以理解为一个对象的别名
有私有和共用之分

每个用户都可以给自己的对象创建自己的同义词
这样创建的同义词只能自己使用
创建私有同义词语法:
Create [OR REPLACE] SYNONYM [schema.]synonym_name FOR [schema.]object_name;

默认只有系统管理员可以创建共用同义词
共用同义词属于oracle的public
public拥有了的权限,oracle所有的用户都自动拥有了并可以使用
创建公有同义词语法:
Create PUBLIC SYNONYM synonym_name FOR [schema.]object_name;

删除同义词的语法:
drop [public] synonym 同义词名称;

私有同义词不能和自己已有的对象同名
公用同义词可以和创建者已有的对象同名

当一个用户的一个对象和公有同义词同名时
使用时自己的对象优先

私有同义词和共用同义词可以同名
使用时私有同义词优先

所以这几种对象如果有同名,语句中的使用顺序是:
先使用自己的固有对象或私有同义词,最后使用公用同义词

根据网上得到的资料,
我也自己动手查了查V$MYSTAT同义词的来源

查询V$MYSTAT的说明:

SQL> select * from dict where table_name='V$MYSTAT';

TABLE_NAME
------------------------------
COMMENTS
------------------------------ 
V$MYSTAT
Synonym for V_$MYSTAT

V$MYSTAT是一个同义词是V_$MYSTAT的同义词

再在库中的同义词数据字典中查找这个同义词

SQL> select * from dba_synonyms where SYNONYM_NAME='V$MYSTAT';

OWNER      SYNONYM_NAME         TABLE_OWNE TABLE_NAME           DB_LINK
---------- -------------------- ---------- -------------------- --------------------
PUBLIC     V$MYSTAT             SYS        V_$MYSTAT

说明V$MYSTAT是SYS用户的V_$MYSTAT视图的共用同义词

查询V_$MYSTAT视图的定义

SQL> select OWNER,VIEW_NAME,TEXT from dba_views where view_name = 'V_$MYSTAT';

OWNER      VIEW_NAME                      TEXT
---------- ------------------------------ --------------------------------------------------------------------------------
SYS        V_$MYSTAT                      select "SID","STATISTIC#","VALUE" from v$mystat

TEXT字段是这个视图的定义
select “SID”,”STATISTIC#”,”VALUE” from v$mystat

也可以通过dbms_metadata.get_ddl
查询V_$MYSTAT视图的定义

dbms_metadata.get_ddl返回的是long类型的结果
long型数据为可变长字符串,最大长度限制是2GB
sqlplus处理long型数据非常困难
因为里面存的数据一般都很长
sqlplus显示时一般只能显示出来一部分
所以想显示完整的long型数据
要先给sqlplus环境设置LONG参数

SQL> SET LONG 9999
SQL> select dbms_metadata.get_ddl('VIEW','V_$MYSTAT') from dual;

DBMS_METADATA.GET_DDL('VIEW','V_$MYSTAT')
--------------------------------------------------------------------------------

  CREATE OR REPLACE FORCE VIEW "SYS"."V_$MYSTAT" ("SID", "STATISTIC#", "VALUE") AS
  select "SID","STATISTIC#","VALUE" from v$mystat

结果和从dba_views得到的一样

这里又有一个v$mystat
前面的一个是同义词,这一个看看视图定义里面有没有

而视图的定义在
v$fixed_view_definition
中有

这里查询V$MYSTAT的定义

SQL> select * from v$fixed_view_definition where VIEW_NAME = 'V$MYSTAT';

VIEW_NAME
------------------------------
VIEW_DEFINITION
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
V$MYSTAT
select  SID , STATISTIC# , VALUE from GV$MYSTAT where inst_id = USERENV('Instance')

说明有一个固定视图也叫V$MYSTAT它来源于GV$MYSTAT

经过查找和分析
GV$MYSTAT同样有一个同名的PUBLIC同义词和一个固定视图
而且也有一个关联的GV_$MYSTAT视图
PUBLIC同义词GV$MYSTAT来自于GV_$MYSTAT,而GV_$MYSTAT又产生自固定视图GV$MYSTAT

再看一下固定视图GV$MYSTAT的定义

SQL> select * from v$fixed_view_definition where VIEW_NAME = 'GV$MYSTAT';

VIEW_NAME
------------------------------
VIEW_DEFINITION
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
GV$MYSTAT
select inst_id,ksusenum,ksusestn,ksusestv from x$ksumysta where bitand(ksspaflg,1)!=0 and bitand(ksuseflg,1)!=0 and ksusestn<(select ksusgstl from x$ksusgif)

说明固定视图GV$MYSTAT来自于x$ksumysta
这里x$ksumysta表中的信息是oracle实例当前会话的状态信息

可以从v$fixed_table继续查到x$ksumysta和结果中出现的x$ksusgif的信息

SQL> SELECT * FROM v$fixed_table WHERE NAME in ('X$KSUMYSTA','X$KSUSGIF');

NAME                            OBJECT_ID TYPE   TABLE_NUM
------------------------------ ---------- ----- ----------
X$KSUSGIF                      4294951930 TABLE         33
X$KSUMYSTA                     4294951106 TABLE         35

这是固定表,不用再继续找了

一般用户使用的V$MYSTAT是一个共用同义词
它的来源渠道追溯过程是:
V$MYSTAT共用同义词 来自于 V_$MYSTAT视图 来自于 V$MYSTAT固定视图 来自于 GV$MYSTAT 来自于 固定表X$KSUMYSTA
所以V$MYSTAT最终来自于固定表X$KSUMYSTA

前面查询中用到的dict实际也是个共用同义词
SYS用户的DICTIONARY视图有两个共用同义词DICT和DICTIONARY
我们使用了DICT同义词

DICTIONARY是一个数据字典
官方描述是:
DICTIONARY contains descriptions of data dictionary tables and views.

就是DICTIONARY是个数据字典
内容中包含oracle系统中所有数据字典,包括所有数据字典表和数据字典视图的名称和说明。

3)oracle中的PUBLIC角色

前面讲了一个共用同义词创建时
自动的属于了PUBLIC

PUBLIC在oracle中比较特殊,有很多人弄不清楚它到底是什么类型的对象
本人在参考了网上的资料后
下面是我查找的过程

查询PUBLIC在角色中有没有定义:

SQL> select dbms_metadata.get_ddl('ROLE','PUBLIC') from dual;

DBMS_METADATA.GET_DDL('ROLE','PUBLIC')
--------------------------------------------------------------------------------

   CREATE ROLE "PUBLIC"

查询PUBLIC在用户中有没有定义:

SQL> select dbms_metadata.get_ddl('USER','PUBLIC') from dual;
ERROR:
ORA-31603: object "PUBLIC" of type USER not found in schema "SYS"
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 105
ORA-06512: at "SYS.DBMS_METADATA", line 2805
ORA-06512: at "SYS.DBMS_METADATA", line 4333
ORA-06512: at line 1



no rows selected

所以PUBLIC是一个角色,不是用户

但是在DBA_ROLES查询

SQL> select * from DBA_ROLES;

ROLE                           PASSWORD
------------------------------ --------
CONNECT                        NO
RESOURCE                       NO
DBA                            NO
SELECT_CATALOG_ROLE            NO
EXECUTE_CATALOG_ROLE           NO
DELETE_CATALOG_ROLE            NO
EXP_FULL_DATABASE              NO
IMP_FULL_DATABASE              NO
RECOVERY_CATALOG_OWNER         NO
GATHER_SYSTEM_STATISTICS       NO
LOGSTDBY_ADMINISTRATOR         NO
AQ_ADMINISTRATOR_ROLE          NO
AQ_USER_ROLE                   NO
GLOBAL_AQ_USER_ROLE            GLOBAL
SCHEDULER_ADMIN                NO
HS_ADMIN_ROLE                  NO
AUTHENTICATEDUSER              NO
OEM_ADVISOR                    NO
OEM_MONITOR                    NO
WM_ADMIN_ROLE                  NO
JAVAUSERPRIV                   NO
JAVAIDPRIV                     NO
JAVASYSPRIV                    NO
JAVADEBUGPRIV                  NO
EJBCLIENT                      NO
JAVA_ADMIN                     NO
JAVA_DEPLOY                    NO
CTXAPP                         NO
XDBADMIN                       NO
XDBWEBSERVICES                 NO
OLAP_DBA                       NO
OLAP_USER                      NO
MGMT_USER                      NO

33 rows selected.

并没有PUBLIC

查询DBA_ROLES的定义

SQL> select dbms_metadata.get_ddl('VIEW','DBA_ROLES','SYS') from dual;

DBMS_METADATA.GET_DDL('VIEW','DBA_ROLES','SYS')
--------------------------------------------------------------------------------

  CREATE OR REPLACE FORCE VIEW "SYS"."DBA_ROLES" ("ROLE", "PASSWORD_REQUIRED") AS
  select name, decode(password, null, 'NO', 'EXTERNAL', 'EXTERNAL',
                      'GLOBAL', 'GLOBAL', 'YES')
from  user$
where type# = 0 and name not in ('PUBLIC', '_NEXT_USER')

结果中有这么一句
name not in (‘PUBLIC’, ‘_NEXT_USER’)
说明DBA_ROLES生成时过滤掉了PUBLIC

oracle中的角色是一种权限的集合
如常用的CONNECT连接角色,RESOURCE资源角色,DBA数据库管理员角色是ORACLE系统的三个内置角色
可以把单个的权限再赋予角色使角色的权限增加
如:

SQL> select ROLE, PRIVILEGE from role_sys_privs where role='CONNECT';

ROLE                           PRIVILEGE
------------------------------ ----------------------------------------
CONNECT                        CREATE SESSION

SQL> grant CREATE ANY VIEW to CONNECT;

Grant succeeded.

SQL> select ROLE, PRIVILEGE from role_sys_privs where role='CONNECT';

ROLE                           PRIVILEGE
------------------------------ ----------------------------------------
CONNECT                        CREATE ANY VIEW
CONNECT                        CREATE SESSION

也可以回收角色的权限

SQL> revoke CREATE ANY VIEW from CONNECT;

Revoke succeeded.

SQL> select ROLE, PRIVILEGE from role_sys_privs where role='CONNECT';

ROLE                           PRIVILEGE
------------------------------ ----------------------------------------
CONNECT                        CREATE SESSION

但最终这些角色和单个的权限是要被赋予用户来起作用的

查看用户拥有的权限
select grantee,privilege from dba_sys_privs where grantee=’HR’;
如结果:

SQL> select grantee,privilege from dba_sys_privs where grantee='HR';

GRANTEE                        PRIVILEGE
------------------------------ ----------------------------------------
HR                             CREATE VIEW
HR                             UNLIMITED TABLESPACE
HR                             CREATE DATABASE LINK
HR                             CREATE SEQUENCE
HR                             CREATE SESSION
HR                             ALTER SESSION
HR                             CREATE SYNONYM

7 rows selected.

使用授权语句时可以把单个权限分别赋予单个用户
也可以把权限的集合角色授予一个用户

我们可以把权限赋予PUBLIC

SQL> grant CREATE ANY VIEW to PUBLIC;

Grant succeeded.

同时也可以把PUBLIC赋予用户

SQL> grant PUBLIC to HR;

Grant succeeded.

如果把用户赋予用户是不允许的:

SQL> grant sys to HR;
grant sys to HR
      *
ERROR at line 1:
ORA-01919: role 'SYS' does not exist

进一步说明PUBLIC是个角色

再查HR用户的权限

HR的系统权限

SQL> select * from dba_sys_privs where grantee = 'HR';

GRANTEE                        PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
HR                             CREATE VIEW                              NO
HR                             UNLIMITED TABLESPACE                     NO
HR                             CREATE DATABASE LINK                     NO
HR                             CREATE SEQUENCE                          NO
HR                             CREATE SESSION                           NO
HR                             ALTER SESSION                            NO
HR                             CREATE SYNONYM                           NO

7 rows selected.

HR的角色权限

SQL> select * from dba_role_privs where grantee = 'HR';

GRANTEE                        GRANTED_ROLE                   ADM DEF
------------------------------ ------------------------------ --- ---
HR                             RESOURCE                       NO  YES
HR                             PUBLIC                         NO  YES

这时HR用户我们看到在已经赋予的角色GRANTED_ROLE中有了PUBLIC角色权限,
这是我前面手动赋予了HR用户的权限
尽管它原来就有,但在这里显示出来了

而HR用户初始的角色权限是这样的:

SQL> select * from dba_role_privs where grantee = 'HR';

GRANTEE                        GRANTED_ROLE                   ADM DEF
------------------------------ ------------------------------ --- ---
HR                             RESOURCE                       NO  YES

这是HR角色权限的默认状态

所以可以确定PUBLIC是一个角色了
但这个角色比较特殊
在很多的表和视图都给屏蔽掉了

但有的地方还是可以查到的

SQL> select * from dba_role_privs where grantee = 'PUBLIC';

GRANTEE                        GRANTED_ROLE                   ADM DEF
------------------------------ ------------------------------ --- ---
PUBLIC                         RESOURCE                       NO  YES

SQL> select * from dba_sys_privs where grantee = 'PUBLIC';

GRANTEE                        PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
PUBLIC                         UNLIMITED TABLESPACE                     NO
PUBLIC                         CREATE ANY VIEW                          NO

这两个查询列出了PUBLIC拥有的角色权限和系统权限
同样也可以给PUBLIC添加新的权限,CREATE ANY VIEW就是我自己给它添加的

public拥有的权限,所有的用户都自动的拥有了
也就是所有的用户初始默认都拥有PUBLIC角色的权限

七)两个事务间锁争用实例

1)两个事务争用锁

我们执行一个
update employees set last_name=last_name||’a’ where department_id=60;
开始一个事务

开始实验

在其中一个sqlplus中执行

SQL> update employees set last_name=last_name||'a' where department_id=60;

5 rows updated.

当然我们讲过
这个事务一旦开始以后
伴随着一堆的锁

执行这个语句的SID是139

我们先查一下和事务相关的
select xidusn,xidslot,xidsqn,status from v$transaction;

刚才已经开始一个事务了
使用sys用户看一下有多少事务

因为刚开始一个事务
它是active的没有提交
它在v$transaction里面一定会出现

SQL> select xidusn,xidslot,xidsqn,status from v$transaction;

    XIDUSN    XIDSLOT     XIDSQN STATUS
---------- ---------- ---------- ----------------
         7         23        238 ACTIVE

这就是刚才我们的事务

然后我们可以去查一下
刚才在139开始的一个事务
sys使用下面的语句查一下

查询结果

SQL>

以上是关于oracle学习笔记 锁相关视图及相关操作的主要内容,如果未能解决你的问题,请参考以下文章

oracle学习笔记 字符集正确设置及相关操作

oracle学习笔记 字符集正确设置及相关操作

Oracle学习笔记_09_字符串相关函数

入门篇Android学习笔记——项目结构及相关基础知识

详解数仓的锁相关参数及视图

Oracle数据库锁管理及锁分析_超越OCP精通Oracle视频课程培训10