Oracle多粒度封闭机制研究(一)-入门底子[Oracle防范]
本文“Oracle多粒度封闭机制研究(一)-入门底子[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锁,那么该锁的申请也应被阻塞.假如表中的数据很多,逐行查抄锁标志的开销将很大,系统的性能将会遭到影响.为了办理这个问题,可以在表级引入新的锁范例来表示其所属行的加锁情形,这就引出了"意向锁"的概念.
意向锁的含义是假如对一个结点加意向锁,则阐明该结点的下层结点正在被加锁;对任一结点加锁时,必须先对它的上层结点加意向锁.如:对表中的任一行加锁时,必须先对它所在的表加意向锁,然后再对该行加锁.这样一来,事件对表加锁时,就不再需求查抄表中每行记录的锁标志位了,系统效率得以大大提高.
以上是“Oracle多粒度封闭机制研究(一)-入门底子[Oracle防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |