




已阅读5页,还剩61页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Oracle 多粒度封锁机制研究1 引言数据库锁的基本概念为了确保并发用户在存取同一数据库对象时的正确性(即无丢失修改、可重复读、不读“脏”数据) ,数据库中引入了锁机制。基本的锁类型有两种:排它锁(Exclusive locks 记为 X 锁)和共享锁(Share locks 记为 S 锁) 。排它锁:若事务 T 对数据 D 加 X 锁,则其它任何事务都不能再对 D 加任何类型的锁,直至 T释放 D 上的 X 锁;一般要求在修改数据前要向该数据加排它锁,所以排它锁又称为写锁。共享锁:若事务 T 对数据 D 加 S 锁,则其它事务只能对 D 加 S 锁,而不能加 X 锁,直至 T 释放 D 上的 S 锁;一般要求在读取数据前要向该数据加共享锁,所以共享锁又称为读锁。2 Oracle 多粒度封锁机制介绍根据保护对象的不同,Oracle 数据库锁可以分为以下几大类:(1) DML lock(data locks,数据锁):用于保护数据的完整性;(2) DDL lock(dictionary locks,字典锁):用于保护数据库对象的结构(例如表、视图、索引的结构定义) ;(3) internal locks 和 l a t c h es(内部锁与闩):保护内部数据库结构;(4) distributed locks(分布式锁):用于 OPS(并行服务器)中;(5) PCM locks(并行高速缓存管理锁):用于 OPS(并行服务器)中。本文主要讨论 DML(也可称为 data locks,数据锁)锁。从封锁粒度(封锁对象的大小)的角度看,Oracle DML 锁共有两个层次,即行级锁和表级锁。2.1 Oracle 的 TX 锁(行级锁、事务锁)许多对 Oracle 不太了解的技术人员可能会以为每一个 TX 锁代表一条被封锁的数据行,其实不然。TX 的本义是 Transaction(事务) ,当一个事务第一次执行数据更改(Insert、Update、Delete)或使用 SELECT FOR UPDATE 语句进行查询时,它即获得一个 TX(事务)锁,直至该事务结束(执行 COMMIT 或 ROLLBACK 操作)时,该锁才被释放。所以,一个 TX 锁,可以对应多个被该事务锁定的数据行。在 Oracle 的每行数据上,都有一个标志位来表示该行数据是否被锁定。Oracle 不象其它一些DBMS(数据库管理系统)那样,建立一个链表来维护每一行被加锁的数据,这样就大大减小了行级锁的维护开销,也在很大程度上避免了其它数据库系统使用行级封锁时经常发生的锁数量不够的情况。数据行上的锁标志一旦被置位,就表明该行数据被加 X 锁,Oracle 在数据行上没有 S 锁。2.2 TM 锁(表级锁)2.2.1 意向锁的引出表是由行组成的,当我们向某个表加锁时,一方面需要检查该锁的申请是否与原有的表级锁相容;另一方面,还要检查该锁是否与表中的每一行上的锁相容。比如一个事务要在一个表上加 S 锁,如果表中的一行已被另外的事务加了 X 锁,那么该锁的申请也应被阻塞。如果表中的数据很多,逐行检查锁标志的开销将很大,系统的性能将会受到影响。为了解决这个问题,可以在表级引入新的锁类型来表示其所属行的加锁情况,这就引出了“意向锁”的概念。意向锁的含义是如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁;对任一结点加锁时,必须先对它的上层结点加意向锁。如:对表中的任一行加锁时,必须先对它所在的表加意向锁,然后再对该行加锁。这样一来,事务对表加锁时,就不再需要检查表中每行记录的锁标志位了,系统效率得以大大提高。2.2.2 意向锁的类型由两种基本的锁类型(S 锁、X 锁) ,可以自然地派生出两种意向锁:意向共享锁(Intent Share Lock,简称 IS 锁):如果要对一个数据库对象加 S 锁,首先要对其上级结点加 IS 锁,表示它的后裔结点拟(意向)加 S 锁;意向排它锁(Intent Exclusive Lock,简称 IX 锁):如果要对一个数据库对象加 X 锁,首先要对其上级结点加 IX 锁,表示它的后裔结点拟(意向)加 X 锁。另外,基本的锁类型(S、X)与意向锁类型(IS、IX )之间还可以组合出新的锁类型,理论上可以组合出4种,即: S+IS,S+IX,X+IS,X+IX,但稍加分析不难看出,实际上只有 S+IX 有新的意义,其它三种组合都没有使锁的强度得到提高(即:S+IS=S,X+IS=X,X+IX=X,这里的“=”指锁的强度相同) 。所谓锁的强度是指对其它锁的排斥程度。这样我们又可以引入一种新的锁的类型共享意向排它锁(Shared Intent Exclusive Lock,简称 SIX 锁) :如果对一个数据库对象加 SIX锁,表示对它加 S 锁,再加 IX 锁,即 SIX=S+IX。例如:事务对某个表加 SIX 锁,则表示该事务要读整个表(所以要对该表加 S 锁) ,同时会更新个别行(所以要对该表加 IX 锁) 。这样数据库对象上所加的锁类型就可能有5种:即 S、X、IS 、IX 、SIX。具有意向锁的多粒度封锁方法中任意事务 T 要对一个数据库对象加锁,必须先对它的上层结点加意向锁。申请封锁时应按自上而下的次序进行;释放封锁时则应按自下而上的次序进行;具有意向锁的多粒度封锁方法提高了系统的并发度,减少了加锁和解锁的开销。2.2.3 Oracle 的 TM 锁(表级锁)Oracle 的 DML 锁(数据锁)正是采用了上面提到的多粒度封锁方法,其行级锁虽然只有一种(即 X锁) ,但其 TM 锁(表级锁)类型共有5种,分别称为共享锁(S 锁) 、排它锁(X 锁) 、行级共享锁(RS 锁) 、行级排它锁(RX 锁) 、共享行级排它锁(SRX 锁) ,与上面提到的 S、X 、IS、IX、SIX 相对应。需要注意的是,由于 Oracle 在行级只提供 X 锁,所以与 RS 锁(通过 SELECT FOR UPDATE 语句获得)对应的行级锁也是 X 锁(但是该行数据实际上还没有被修改) ,这与理论上的 IS锁是有区别的。下表为 Oracle 数据库 TM 锁的相容矩阵(Y=Yes,表示相容的请求; N=No,表示不相容的请求;-表示没有加锁请求):T2T1S X RS RX SRX -S Y N Y N N YX N N N N N YRS Y N Y Y Y YRX N N Y Y N YSRX N N Y N N Y- Y Y Y Y Y Y表一: Oracle 数据库 TM 锁的相容矩阵一方面,当 Oracle 执行 SELECTFOR UPDATE、INSERT 、UPDATE、DELETE 等 DML 语句时,系统自动在所要操作的表上申请表级 RS 锁(SELECTFOR UPDATE)或 RX 锁(INSERT、UPDATE、DELETE) ,当表级锁获得后,系统再自动申请 TX 锁,并将实际锁定的数据行的锁标志位置位(指向该 TX 锁) ;另一方面,程序或操作人员也可以通过 LOCK TABLE 语句来指定获得某种类型的 TM 锁。下表总结了 Oracle 中各 SQL 语句产生 TM 锁的情况:SQL 语句 表锁模式 允许的锁模式Select * from table_name 无 RS、RX、S、SRX、XInsert into table_name RX RS、RXUpdate table_name RX RS、RXDelete from table_name RX RS、RXSelect * from table_name for update RS RS、RX、S、SRXlock table table_name in row share mode RS RS、RX、S、SRXlock table table_name in row exclusive mode RX RS、RXlock table table_name in share mode S RS、Slock table table_name in share row exclusive mode SRX RSlock table table_name in exclusive mode X 无表二:Oracle 数据库 TM 锁小结我们可以看到,通常的 DML 操作( SELECTFOR 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 申请的锁模式:具体值同上面的 LMODECTIME NUMBER 已持有或等待锁的时间;BLOCK NUMBER 是否阻塞其它锁申请;表三:v$lock 视图主要字段说明其中在 TYPE 字段的取值中,本文只关心 TM、TX 两种 DML 锁类型;关于 ID1、ID2,TYPE 取值不同其含义也有所不同:TYPE ID1 ID2TM 被修改表的标识(object_id ) 0TX 以十进制数值表示该事务所占用的回滚段号与该事务在该回滚段的事务表(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 视图字段说明3.2 监控脚本根据上述系统视图,可以编制脚本来监控数据库中锁的状况。3.2.1 showlock.sql第一个脚本 showlock.sql,该脚本通过连接 v$locked_object 与 all_objects 两视图,显示哪些对象被哪些会话锁住:/* showlock.sql */column o_name format a10column lock_type format a20column object_name format a15select rpad(oracle_username,10) o_name,session_id sid,decode(locked_mode,0,None,1,Null,2,Row share,3,Row Exclusive,4,Share,5,Share Row Exclusive,6,Exclusive) lock_type,object_name ,xidusn,xidslot,xidsqnfrom v$locked_object,all_objectswhere v$locked_object.object_id=all_objects.object_id;3.2.2 showalllock.sql第二个脚本 showalllock.sql,该脚本主要显示当前所有 TM、TX 锁的信息;/* showalllock.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_type,request,ctime,blockfrom v$lockwhere TYPE IN(TX,TM);4 Oracle 多粒度封锁机制示例以下示例均运行在 Oracle 8.1.7上,数据库版本不同,其输出结果也可能有所不同。首先建立3个会话,其中两个(以下用 SESS#1、SESS#2表示)以 SCOTT 用户连入数据库,以操作 Oracle 提供的示例表(DEPT、EMP) ;另一个(以下用 SESS#3表示)以 SYS 用户连入数据库,用于监控;4.1 操作同一行数据引发的锁阻塞SESS#1:SQL select * from dept for update;DEPTNO DNAME LOC- - -10 account 7020 research 830 sales 840 operations 8SESS#3:SQL showlockO_NAME SID LOCK_TYPE OBJECT_NAME XIDUSN XIDSLOT XIDSQN- - - - - - -SCOTT 17 Row share DEPT 82 5861SQL showalllockSID TY ID1 ID2 LOCK_TYPE REQUEST CTIME BLOCK- - - - - - - -17 TX 524290 5861 Exclusive 0 761 017 TM 32970 0 Row share 0 761 0如第一个脚本 showlock 所示,执行完
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2022毕业生简短实习心得
- 《少年的你》观后感集合15篇
- 年产20万吨本色浆替代废纸浆项目初步设计(参考范文)
- 2023年学校元旦晚会活动方案
- 货运站场转型升级规划设计方案(范文模板)
- 民宿室内设计设计方案
- 名人传核心价值解读
- 制图零件设计规范
- 河南省濮阳市、许昌市两地2022-2023学年高一上学期期末语文 含解析
- 河北师范大学汇华学院《模拟系统集成》2023-2024学年第二学期期末试卷
- 2025年中级会计师考试试卷及答案
- 2025年入团考试知识点概述与试题及答案
- 2025届高三下学期5月青桐鸣大联考 英语试卷+答案
- 演出服装定制合同协议
- 形势与政策(贵州财经大学)知到智慧树章节答案
- 从创意到创业智慧树知到期末考试答案章节答案2024年湖南师范大学
- DL-T 1476-2023 电力安全工器具预防性试验规程
- 更换岩棉彩钢板施工方案
- 国际贸易销售合同中英文
- 余数与除数的关系导学案
- EAP:企业实施EAP的建议
评论
0/150
提交评论