表一:Oracle 数据库 TM 锁的相容矩阵
一方面,当Oracle 执行SELECT…FOR UPDATE、 INSERT、 UPDATE、 DELETE等 DML语句时,系统自动在所要操作的表上申请表级RS锁(SELECT…FOR UPDATE)或 RX锁(INSERT、UPDATE、DELETE),当表级锁获得后,系统再自动申请 TX 锁,并将实际锁定的数据行的锁标志位置位(指向该TX锁);另一方面,程序或操作人员也可以通过 LOCK TABLE 语句来指定获得某种类型的TM锁。下表总结了 Oracle中各 SQL语句产生 TM锁的情况:
SQL语句 表锁模式 允许的锁模式
|
表二:Oracle 数据库 TM 锁小结
我们可以看到,通常的 DML 操作(SELECT…FOR UPDATE、INSERT、UPDATE、DELETE),在表级获得的只是意向锁(RS或 RX),其真正的封锁粒度还是在行级;另外,Oracle数据库的一个显著特点是,在缺省情况下,单纯地读数据(SELECT)并不加锁, Oracle 通过回滚段(Rollback segment)来保证用户不读“脏”数据。这些都极大地提高了系统的并发程度。
由于意向锁及数据行上锁标志位的引入,极大地减小了 Oracle 维护行级锁的开销,这些技术的应用使Oracle 能够高效地处理高度并发的事务请求。
3、Oracle 多粒度封锁机制的监控
3.1、系统视图介绍
为了监控Oracle系统中锁的状况,我们需要对几个系统视图有所了解:
3.1.1、v$lock视图
v$lock视图列出当前系统持有的或正在申请的所有锁的情况,其主要字段说明如下:
字段名称 类型 说明
SID NUMBER 会话(SESSION)标识;
TYPE VARCHAR(2) 区分该锁保护对象的类型;
ID1 NUMBER 锁标识1;
ID2 NUMBER 锁标识2;
LMODE NUMBER 锁模式:
|
REQUEST NUMBER 申请的锁模式:具体值同上面的LMODE
CTIME NUMBER 已持有或等待锁的时间;
BLOCK NUMBER 是否阻塞其它锁申请;
表三:v$lock 视图主要字段说明
其中在TYPE 字段的取值中,本文只关心 TM、TX两种DML锁类型;
关于ID1、ID2,TYPE取值不同其含义也有所不同:
TYPE ID1 ID2
TM 被修改表的标识(object_id) 0
TX 以十进制数值表示该事务所占用的回滚段号与该事务在该回滚段的事务表(Transaction table)中所占用的槽号(slot number,可理解为记录号)。其组成形式为:
0xRRRRSSSS ( RRRR = RBS number, SSSS = slot )。
以十进制数值表示环绕(wrap)次数,即该槽(slot)被重用的次数;
表四:v$lock 视图中 ID1与 ID2 字段取值说明
3.1.2、v$locked_object 视图
v$locked_object视图列出当前系统中哪些对象正被锁定,其主要字段说明如下:
字段名称 类型 说明
XIDUSN NUMBER 回滚段号;
XIDSLOT NUMBER 槽号;
XIDSQN NUMBER 序列号;
OBJECT_ID NUMBER 被锁对象标识; SESSION_ID NUMBER 持有锁的会话(SESSION)标识;
ORACLE_USERNAME VARCHAR2(30) 持有该锁的用户的Oracle用户名;
OS_USER_NAME VARCHAR2(15) 持有该锁的用户的操作系统用户名;
PROCESS VARCHAR2(9) 操作系统的进程号;
LOCKED_MODE NUMBER 锁模式,取值同表三中的LMODE;
表五:v$locked_object 视图字段说明
| 共6页: 上一页 [1] 2 [3] [4] [5] [6] 下一页 | ||||||||
|