深入浅出oracle锁_第1页
深入浅出oracle锁_第2页
深入浅出oracle锁_第3页
深入浅出oracle锁_第4页
深入浅出oracle锁_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精品资料推荐深入浅出oracle锁一原理篇深入浅出oracle锁锁阻塞的分析深入浅出oracle锁一原理篇在现代的多用户多任务系统中,必然会出现多个用户同时访问共享的某个对象,这个对象可能是表,行,或者内存结构,为了解决多个用户并发性访问带来的数据的安全性,完整性及一致性问题,必须要有一种机制,来使对这些共享资源的并发性访问串行化,oracle中的锁就可以提供这样的功能,当事务在对某个对象进行操作前,先向系统发出请求,对其加相应的锁,加锁后该事务就对该数据对象有了一定的控制权限,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作(可以做select动作,但select利用的是undo中

2、的前镜像数据了).Oracle锁的分类Oracle锁基本上可以分为二类a:共享锁(sharelocks)也称读锁,s锁b:排它锁(exclusivelocks)也称写锁,x锁在数据库中有两种基本的锁类型:排它锁EExclusiveLocks,即X锁)和共享锁(ShareLocks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。按锁保护的内容分类oracle提供多粒度封锁机制,按保护对象来分,据此又可以分为a:dml锁,datalocks数据锁,用来保护数据的完整性和

3、一致性b:ddl锁,dictionarylocks字典锁,用来保护数据对象的结构,如table,index的定义c:内部锁和闩internallocksandlatchs用来保护数据库内部结构,如sga内存结构dml锁DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TM锁的种类有S,X,SR,SX,SRX五种,TX锁称为事务锁或行级锁。当Oracle执行delete,update,insert,selectforupdateDML语句时,oracle首先自动在所要操作的表上申请TM类型的锁。当TM锁获得后,再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位(lb即lockbytes)

4、进行置位。在记录被某一会话锁定后,其他需要访问被锁定对象的会话会按先进先出的方式等待锁的释放,对于select操作而言,并不需要任何锁,所以即使记录被锁定,select语句依然可以执行,实际上,在此情况下,oracle是用到undo的内容进行一致性读来实现的。在Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。在数据行上只有X锁(排他锁),就是说TX锁只能是排他锁,在记录行上设置共享锁没有意义。当两个或多个会话在表的同一条记录上执行DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可

5、以加锁。在数据表上,oracle默认是共享锁,在执行dml语句的时候,oracle会先申请对象上的共享锁,防止其他会话在这个对象上做ddl语句,成功申请表上的共享锁后,再在受影响的记录上加排它所,防止其他会话对这些做修改动作。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X等多种模式,在数据库中用06来表示。不同的SQL操作产生不同类型的TM锁。如表1所示。和锁相关的性能视图介绍v$lockSID会话的sid,可以和v$session关联TYPE区分该锁保护对象的类型,如tm,tx,rt,mr等ID

6、1锁表示1,详细见下说明ID2锁表示2,详细见下说明LMODE锁模式,见下面说明REQUEST申请的锁模式,同lmodeCTIME已持有或者等待锁的时间BLOCK是否阻塞其他会话锁申请1:阻塞0:不阻塞LMODE取彳t0,1,2,3,4,5,6,数字越大锁级别越高,影响的操作越多。1级锁:Select,有时会在v$locked_object出现。2级锁即RS锁相应的sql有:Selectforupdate,LockxxxinRowSharemode,selectforupdate当对话使用forupdate子串打开一个游标时,所有返回集中的数据行都将处于行级(Row-X)独占式锁定,其他对象只

7、能查询这些数据行,不能进行update、delete或selectforupdate操作。3级锁即RX锁相应的sql有:Insert,Update,Delete,LockxxxinRowExclusivemode,没有commit之前插入同样的一条记录会没有反应,因为后一个3的锁会一直等待上一个3的锁,我们必须释放掉上一个才能继续工作。4级锁即S锁相应的sql有:CreateIndex,LockxxxinSharemode5级锁即SRX锁相应的sql有:LockxxxinShareRowExclusivemode,当有主外键约束时update/delete.;可能会产生4,5的锁。6级锁即X锁

8、相应的sql有:Altertable,Droptable,DropIndex,Truncatetable,LockxxxinExclusivemodeID1,ID2的取值含义根据type的取值而有所不同对于TM锁ID1表示被锁定表的object_id可以和dba_objects视图关联取得具体表信息,ID2值为0对于TX锁ID1以十进制数值表示该事务所占用的回滚段号和事务槽slotnumber号,其组形式:0xRRRRSSSS,RRRR=RBS/UNDONUMBER,SSSS=SLOTNUMBERID2以十进制数值表示环绕wrap的次数,即事务槽被重用的次数v$locked_objectXID

9、USNundosegmentnumber,可以和v$transaction关联XIDSLOTundoslotnumberXIDSQN序列号OBJECT_ID被锁定又t象的object'd,可以和dba_objects关联SESSION_ID持有该锁的session_id,可以和v$session关联ORACLE_USERNAME持有该锁的oracle帐号OS_USER_NAME持有该锁的操作系统帐号PROCESS操作系统的进程号,可以和v$process关联LOCKED_MODE锁模式,含义同v$lock.lmodeDba_locks和v$lock内容差不多,略V$session如果某

10、个session被因为某些行被其他会话锁定而阻塞,则该视图中的下面四个字段列出了这些行所属对象的相关信息ROW_WAIT_FILE#等待的行所在的文件号ROW_WAIT_OBJ#等待的行所属的object_idROW_WAIT_BLOCK#等待的行所属的blockROW_WAIT_ROW#等待的行在blcok中的位置手工释放锁altersystemkillsession'sid,serial#'深入浅出oracle锁一锁阻塞的分析上篇深入浅出oracle锁一原理篇是以理论为主,此文章列举三个关于锁阻塞的例子,并对此作详细的说明,话不多说,直接开题。一:外键没有索引,引起阻塞外键

11、没有建立索引而引起的阻塞应该是最常见到,下面举例对此详细分析SQL>DELETEEMPWHEREEMPNO=7900;已删除1行。SQL>Selectsid,type,id1,id2,lmode,request,ctime,blockFromv$lockWhereTypeIn('TM','TX');SIDTYPEID1ID2LMODEREQUESTCTIMEBLOCK10TX458791181360416010TM30139030416010TM301370204160SQL>selecttrunc(458791/power(2,16),mod

12、(458791,power(2,16)fromdual;TRUNC(458791/POWER(2,16)MOD(458791,POWER(2,16)739再来查v$transaction,看看sid=10会话当前使用的undosegment和slotSQL>selectaddr,xidusn,xidslot,xidsqnfromv$transaction2whereaddrin(selecttaddrfromv$sessionwheresid=10);ADDRXIDUSNXIDSLOTXIDSQN67BAB0CC7391813对于tx锁,v$lock中的id1即为持有该锁的事务的回滚段号

13、,事务槽号的组合再来看SQL>selectowner,object_namefromdba_objectswhereobject_idin(30139,30137);OWNEROBJECT_NAMESCOTTDEPTSCOTTEMP对于tm锁,id1即为持有该锁的对象的id,结合上一个查询,可以看到,该会话对30139即emp表力口了lmode=3的锁,即rx锁,同时,对30137即dept力口了lmode=2的锁,即rs锁。接下来在另外一会话中执行如下语句deletedeptwhere1=0该会话被阻塞查看v$lockSQL>Selectsid,type,id1,id2,lmod

14、e,request,ctime,blockFromv$lockWhereTypeIn('TM','TX');SIDTYPEID1ID2LMODEREQUESTCTIMEBLOCK10TX458791181360416010TM30139030416110TM30137020416012TM30139004372012TM301370303720可以看到,另一个会话(sid=12)对30137即dept加了lmode=3的锁,即rx锁。同时请求对30139即emp表力口了lmode=4的锁,即s锁(request=4),但该请求被阻塞(s和rx不相容),可以通过i

15、d1,id2,blo不字段看到,此会话sid=10会话阻塞。接下来,在emp的外键字段deptno建立索引SQL>createindexidx_emp_deptonemp(deptno);Indexcreated按原步骤重复上面的实验SQL>DELETEEMPWHEREEMPNO=7900;已删除1行。SQL>Selectsid,type,id1,id2,lmode,request,ctime,blockFromv$lockWhereTypeIn('TM','TX');SIDTYPEID1ID2LMODEREQUESTCTIMEBLOCK10T

16、X196632225160386010TM30139030386010TM301370203860可以看到,是否建立索引,对emp表的锁情况没有影响。在另外一个会话中执行如下语句SQL>DELETEDEPTWHERE1=0;已删除0行。该语句没有被阻塞,可以执行。看看当前的锁信息SQL>Selectsid,type,id1,id2,lmode,request,ctime,blockFromv$lockWhereTypeIn('TM','TX');6精品资料推荐SIDTYPEID1ID2LMODEREQUESTCTIMEBLOCK10TX1966322

17、25160435010TM30139030435010TM30137020435012TM301390209012TM3013703090可以看到,在外键上建立索引后,删除父表,对子表加的是rs锁,比没有索引加s的强度要低,这样避免了阻塞的发生,提高了系统的并行性。二:位图索引带来的阻塞位图索引适合建在低基数列上面,在数据仓库比较常用,如果是在并发性要求较高的01tp系统就要慎重了,不当的应用,可能会带来严重的阻塞。SQL>createbitmapindexbidx_emp_jobonemp(job);索引已创建。SQL>DELETEEMPWHEREEMPNO=7369;已删除1行

18、。在另外一会话中执行sql_语句SQL>DELETEEMPWHEREEMPNO=7876;该语句阻塞SQL>Selectsid,type,id1,id2,lmode,request,ctime,blockFromv$lockWhereTypeIn('TM','TX');SIDTYPEID1ID2LMODEREQUESTCTIMEBLOCK10TX524312236260116110TM30137020116012TX58986423996098012TM3013903098012TM3013702098012TX524312236204980可以看到,sid=12的会话等待sid=10持有的tx锁,虽然删除的是不同记录,但因为empno等于7876,7369的job字段值都是CLERK冲我们恰恰在job字段建立了位图索引,第一个dml语句引起了对job=CLERK位图段的锁定,进而阻塞了第二个会话对该位图段其他记录的dml操作(注:如此时对job&

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论