oracle的TM锁T锁知识完全普及_第1页
oracle的TM锁T锁知识完全普及_第2页
oracle的TM锁T锁知识完全普及_第3页
oracle的TM锁T锁知识完全普及_第4页
oracle的TM锁T锁知识完全普及_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、o r a c l e 的 T M 锁T X 锁知识完全普及锁概念基础数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事 务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。加锁是实现数据库并发控制的一个非常重要的技术。 当事务在对某个数据对象进行操作前, 先向系 统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制, 在该事务释放锁之前,其他 的事务不能对此数据对象进行更新操作。在数据库中有两种基本的锁类型:排它锁(ExclusiveLocks,即X锁)和共享锁(ShareLocks,即 S锁)。当数据

2、对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可 以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。Oracle数据库的锁类型根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML( datalocks,数据锁),用 于保护数据的完整性;DDL( dictio narylocks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(in ternallocksa ndlatches),保护数据库的内部结构。DML锁的目的在于保证并发情况下的数据完整性,。在Oracle数据库中,DML锁主要包括TM锁和

3、TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。当Oracle执行DMI语句时,系统自动在所要操作的表上申请 TM类型的锁。当TM锁获得后,系统 再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查 TM锁模式的相容性即可,大大提高了系统的效 率。TM锁包括了 SS SX S、X等多种模式,在数据库中用0 6来表示。不同的SQL操作产生不 同类型的TM锁。在数据行上只有X锁(排他锁)。在Oracle数据库中,当一个事务首次发起一个 DML语句时就获 得一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话

4、在表的同一条记录上执行DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起 Oracle数据库挂起,或导致死锁 的发生,产生ORA-60的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量 事务失败等。悲观封锁和乐观封锁、悲观封锁 锁在用户修改之前就发挥作用:Select.foru pdate(no wait)Select*fromtab1forupdate用户发出这条命令之后, oracle 将会对返回集中的数据建立行级封锁,以防止其他用户的修改。如

5、果此时其他用户对上面返回结果集的数据进行dml或ddl操作都会返回一个错误信息或发生阻塞。1:对返回结果集进行 update 或 delete 操作会发生阻塞。2:对该表进行 ddl 操作将会报: Ora-00054:resourcebusyandacquirewithnowaitspecified.原因分析 此时 Oracle 已经对返回的结果集上加了排它的行级锁,所有其他对这些数据进行的修改或删除操 作都必须等待这个锁的释放,产生的外在现象就是其他的操作将发生阻塞,这个这个操作 commit 或 rollback.同样这个查询的事务将会对该表加表级锁, 不允许对该表的任何 ddl 操作,否

6、则将会报出 ora-00054 错误: :resourcebusyandacquirewithnowaitspecified.、乐观封锁 乐观的认为数据在 select 出来到 update 进取并提交的这段时间数据不会被更改。 这里面有一种潜 在的危险就是由于被选出的结果集并没有被锁定,是存在一种可能被其他用户更改的可能。因此 Oracle 仍然建议是用悲观封锁,因为这样会更安全。阻塞 定义: 当一个会话保持另一个会话正在请求的资源上的锁定时, 就会发生阻塞。被阻塞的会话将一直挂起,直到持有锁的会话放弃锁定的资源为止。4个常见的dml语句会产生阻塞INSERTUPDATEDELETESELE

7、CT FORU PDATEINSERTInsert 发生阻塞的唯一情况就是用户拥有一个建有主键约束的表。当 2 个的会话同时试图向表中 插入相同的数据时,其中的一个会话将被阻塞,直到另外一个会话提交或会滚。一个会话提交时, 另一个会话将收到主键重复的错误。回滚时,被阻塞的会话将继续执行。UP DAT和 DELET当执行Up date和delete操作的数据行已经被另外的会话锁定时,将会发生阻塞, 直到另一个会话提交或会滚。Select forupdate当一个用户发出select.forupdate的错作准备对返回的结果集进行修改时,如果结果集已经被另一个会话锁定,就是发生阻塞。需要等另一个会

8、话结束之后才可继续执行。可以通过发出 select -forupdatenowait的语句来避免发生阻塞,如果资源已经被另一个会话锁定,则会返回以 下错误:Ora-OOO54:resourcebusya ndacquirewith no waits pecified.死锁-deadlock 定义:当两个用户希望持有对方的资源时就会发生死锁 即两个用户互相等待对方释放资源时,oracle认定为产生了死锁,在这种情况下,将以牺牲一个用 户作为代价,另一个用户继续执行,牺牲的用户的事务将回滚.例子:1:用户1对A表进行Up date,没有提交。2:用户2对B表进行Up date,没有提交。此时双反不

9、存在资源共享的问题。3:如果用户2此时对A表作up date,则会发生阻塞,需要等到用户一的事物结束。4:如果此时用户1又对B表作up date,则产生死锁。此时Oracle会选择其中一个用户进行会滚, 使另一个用户继续执行操作。起因:Oracle的死锁问题实际上很少见,如果发生,基本上都是不正确的程序设计造成的,经过调整后, 基本上都会避免死锁的发生。DML锁分类表表1Oracle的TM锁类型锁 模 式锁描述解释SQL操 作0none1NULL空Select2SS(Row-S)行级共享锁, 其他对象只 能查询这些 数据行Selectforu pdate 、Lockfor up date、Lo

10、ckrowshare3SX(Row-X)行级排它锁,Insert 、Update、Delete、在提交前不允许做DML操作Lockrowshare4S(Share)共享锁Create in dex、Lockshare5SSX(S/Row-X)共享行级排 它锁Locksharerowexclusive6X(Exclusive)排它锁Altertable 、Drop able、 Dropindex、Truncatetable 、 Lockexclusive1.关于V$lock表和相关视图的说明Col umnDatatypeDescri pti onADDRRAW(4 Addressoflockst

11、ateobject |8)KADDRRAW(4|8)AddressoflockSIDNUMBE Identifierforsessionholdingoracquiringthelock RTYPEVARCHAR2(2)Typ eofuserorsystemlockThelocks on theusert yp esareobta in edbyusera pp licatio ns.A nyp rocessthatisbloc ki ngothersislikelytobeholdi ngon eoftheselocks.Theusert yp elocksare:TM-DMLe nqueu

12、e?TX-Tra nsactio nenq ueueUL-Users upp lied-我们主要关注TX和TM两种类型的锁-UL锁用户自己定义的,一般很少会定义,基本不用关注-其它均为系统锁,会很快自动释放,不用关注ID1NUMBE Lockide ntifier#1(de pen dso nty pe) RID2NUMBE Lockide ntifier#2(de pen dso nty pe) R-当 locktype 为 TM时,id1 为 DML-lockedobject 的 object_id-当 locktype 为 TX时,id1 为 usn+slot,而 id2 为 seq。-

13、当locktype为其它时,不用关注LMO DENUMBELockmodei nwhichthesessio nholdsthelock: R? 0-none?1-n ull(NULL)? 2-row-S(SS)? 3-row-X(SX)? 4-share(S)? 5-S/Row-X(SSX)? 6-exclusive(X)-大于0时表示当前会话以某种模式占有该锁,等于0时表示当前会话正在等待该锁资源,即表示该会话被阻塞。-往往在发生TX锁时,伴随着TM锁,比如一个sid=9会话拥有一个TM锁,一般会 拥有一个或几个TX锁,但他们的id1和id2是不同的,请注意REQ UES TNUMBELo

14、ckmodei nwhichthe processrequeststhelock: R? 0-none?1-n ull(NULL)? 2-row-S(SS)? 3-row-X(SX)? 4-share(S)? 5-S/Row-X(SSX)? 6-exclusive(X)-大于0时,表示当前会话被阻塞,其它会话占有改锁的模式CTIMENUMBETimesi ncecurre ntmodewasgra nted RBLO NUMBEThelockisblockinganotherlock CK R0,'NotBlocking',/*Notblockinganyotherproces

15、ses*/1,'Blocking',/*Thislockblocksother processes*/2,Global',/*Thislockisglobal,sowecan'ttell*/-该锁是否阻塞了另外一个锁视图名描述主要字段说明v$sessi on查询会话的信息sid,serial#:表示会话信息。和锁的信息。P rogram:表示会话的应用程序信息。2.其它相关视图说明row_wait_obj# :表示等待的对象,和 dba_objects 中的 object_id 相对应。lockwait:该会话等待的锁的地址,与v$lock 的kaddr对应.v

16、$sessi on _wait查询等待的会话 信息。sid :表示持有锁的会话信息。Seconds_in_wait :表示等待持续的时间信息Eve nt:表示会话等待的事件,锁等于en queuedba_locks对v$lock的格式 化视图。Session_id :和 v$lock 中的 Sid 对应。 Lock_type :和 v$lock 中的 type 对应。Lock_ID1 :和 v$lock 中的 ID1 对应。Mode_held,mode_requested :和 v$lock 中 的 Imodejequest 相对应。v$locked_object只包含DML勺锁信 息,包括回滚段和 会话信息。Xidus n, xidslot,xids qn:表示回滚段信息。和v$tra nsacti on 相关联。Object_id :表示被锁对象标识。Session_id :表示持有锁的会话信息。Locked_mode表示会话等待的锁模式的信息,和v$lock中的lmode一致。1.查询数据库中的锁select*fromv$lock;select*fromv$lockwhereblock=1;2. 查询被锁的对象 select*fromv$locked_object;3. 查询阻塞查被阻塞的会话select*fromv$lockwh

温馨提示

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

评论

0/150

提交评论