您所在的位置: 首页>>数据库>>新闻>>

Oracle中通过意向锁多粒度封锁机制进行并发控制(2)

http://database.51cto.com  2008-04-14 14:28  Alice  赛迪网  我要评论(0)

表一: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语句 表锁模式 允许的锁模式

Select * from table_name…… 无 RS、RX、S、SRX、X

Insert into table_name…… RX RS、RX

Update table_name…… RX RS、RX

Delete from table_name…… RX RS、RX

Select * from table_name for update RS RS、RX、S、SRX

lock table table_name in row share mode RS RS、RX、S、SRX

lock table table_name in row exclusive mode RX RS、RX

lock table table_name in share mode S RS、S

lock table table_name in share row exclusive mode SRX RS

lock table table_name in exclusive mode X 无

表二: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 锁模式:

0 (None), 1 (null) ,2 (row share) , 3 (row exclusive) ,4

(share),5(share row exclusive),6(exclusive)

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] 下一页
【内容导航】
 第 1 页:数据库锁的概念  第 2 页:Oracle 数据库 TM 锁的相容矩阵
 第 3 页:监控脚本  第 4 页:实体完整性引发的锁阻塞
 第 5 页:参照完整性引发的锁阻塞  第 6 页:总结
甲骨文Oracle 11g正式发布
Oracle数据库开发之PL/SQL基础应用
Oracle较真SAP-商业管理软件之战一触即发
Oracle数据库开发基础教程
Oracle 10g的基础应用
 
 验证码: (点击刷新验证码)   匿名发表
  • 野蛮生长

  • 作者:冯仑著
  • “地产界的思想家”冯仑纵横生意江湖20年来,第一次系统梳理出书。  三十年来中国民营企业从前公司时代发展到公司时代,21..
Copyright©2005-2008 51CTO.COM 版权所有