第6课 Oracle数据封锁机制研究.docVIP

  • 2
  • 0
  • 约2.97万字
  • 约 21页
  • 2017-09-03 发布于湖北
  • 举报
Oracle数据封锁机制研究 在众多的基于Oracle的数据库应用中,有不少的性能问题是源于对数据封锁机制的错误使用,而当发生问题后,又由于相关人员缺乏经验,不能及时定位与解决问题。对于初学者来讲,完全理解Oracle的数据封锁机制并不容易,对于多种的封锁类型,更容易混淆。本文一方面以实例的形式介绍产生数据封锁的各类情况,另一方面从数据库理论的角度加以分析,以期使读者既知其然,更知其所以然,使读者能够更加深入地理解Oracle的数据封锁机制,而不是简单地记住某些结论。 由于本人的水平有限并且缺乏相关的内部资料,另外Oracle本身也是一个不断发展的软件,所以文中难免会有片面、过时甚至错误的内容,请大家能够及时指正。 引言—数据库锁的基本概念 为了确保并发用户在存取同一数据库对象时的正确性(即无丢失修改、可重复读、不读“脏”数据),数据库中引入了锁机制。基本的锁类型有两种:排它锁(Exclusive locks记为X锁)和共享锁(Share locks记为S锁)。 排它锁:若事务T对数据D加X锁,则其它任何事务都不能再对D加任何类型的锁,直至T释放D上的X锁;一般要求在修改数据前要向该数据加排它锁,所以排它锁又称为写锁。 共享锁:若事务T对数据D加S锁,则其它事务只能对D加S锁,而不能加X锁,直至T释放D上的S锁;一般要求在读取数据前要向该数据加共享锁,所以共享锁又称为读锁。 Oracle 多粒度封锁机制介绍 根据保护对象的不同,Oracle数据库锁可以分为以下几大类: 1)??????? DML lock(data locks,数据锁):用于保护数据的完整性; 2)??????? DDL lock(dictionary locks,字典锁):用于保护数据库对象的结构(例如表、视图、索引的结构定义); 3)??????? internal locks 和l a t c h es(内部锁与闩):保护数据库内部结构。 本文主要讨论DML(也可称为data locks,数据锁)锁。DML锁的目的在于保证在多个并发用户情况下的数据完整性。DML锁防止并发的DML与DDL操作互相产生破坏性的影响。例如,DML锁确保在同一时间,一行数据只被一个事务修改;另外,一个包含有未提交修改的表不能被其它用户删除。 从封锁粒度(封锁对象的大小)的角度看,Oracle DML锁共有两个层次,即行级锁和表级锁。 Oracle的TX锁(事务锁、行级锁) 许多对Oracle不太了解的技术人员可能会以为每一个TX锁代表一被封锁的数据行,其实不然。TX的本义是Transaction(事务),当一个事务第一次执行数据更改(Insert、Update、Delete)或使用SELECT… FOR UPDATE语句进行查询时,它即获得一个TX(事务)锁,直至该事务结束(执行COMMIT或ROLLBACK操作)时,该锁才被释放。所以,一个TX锁,可以对应多个被该事务锁定的数据行。 在Oracle的每行数据上,都有一个标志位来表示该行数据是否被锁定。Oracle不象其它一些DBMS(数据库管理系统)那样,建立一个链表来维护每一行被加锁的数据,这样就大大减小了行级锁的维护开销,也在很大程度上避免了其它数据库系统使用行级封锁时经常发生的锁数量不够的情况,从而也没有必要在某些情况下将行级锁升级为表级锁(或“页”级锁)。数据行上的锁标志一旦被置位,就表明该行被所对应的事务以排它方式占有,从目前掌握的资料看,Oracle事务不能以共享方式锁定某行。 Oracle在每个块(block)的头部,都保留有一个叫做ITL(Interested Transaction List,可译为相关事务列表)的结构,每当一个事务要修改(或SELECT FOR UPDATE)块中的行时,它都需要将自己的事务标识记录在ITL的一项(即slot)中,而被其修改(或SELECT FOR UPDATE)的行的行首的锁标识字节(Lock Bytes),记录事务在ITL中所占用的项。如下例所示:使用ITL第1项的事务对第8行加了锁,使用ITL第2项的事务对第1行加了锁。从某种意义上说,未提交事务所占用的ITL slot与行首的锁标识字节一起构成了对数据行的隐式封锁。 图1:数据块中有关Lock的结构 当一个事务发现自己要修改的数据行已被其它未提交事务修改时,它便处于等待状态,但等待的不是行锁的释放,而是阻塞事务锁的释放。当阻塞事务提交或回滚后,其事务锁被释放,它所对应的隐式的行所也被释放,被阻塞的事务可以继续进行。虽然事务回滚到某个保留点(savepoint),能够释放某些隐式的行锁,但由于其事务锁没有被释放,所以被阻塞的事务仍将继续等待,即使最初引起阻塞的隐式行锁已经被释放情况也是一样,本文后面将有具体的例子予以说明

文档评论(0)

1亿VIP精品文档

相关文档