Oracle多粒度锁机制的总结

来源:互联网 发布:北京平均工资 知乎 编辑:程序博客网 时间:2024/05/19 06:18

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 和 latche(内部锁和闩):保护内部数据库结构;

(4)distributed locks(分布式锁):用于OPS(并行服务器)中;

(5)PCM locks(并行高速缓存管理锁):用于OPS(并行服务器)中;

 

DML(也可称为data locks,数据锁)锁。从封锁粒度(封锁对象的大小)的角度看,Oracle DML锁共有两个层次,即行级锁和表级锁。

2.1 Oracle的TX锁(行级锁,事务锁)

   TX的本义是Transaction(事务),当一个事务第一次执行数据修改(Insert,Update,Delete)或使用Select...For Update语句进行查询时,它即获得一个TX(事务)锁,直至该事务结束(执行Commit或RollBack操作)时,该锁才被释放。所以一个TX锁,可以对应多个被该事务锁定的数据行。

   在Oracle数据行上,都有一个标志位来表示该行数据是否被锁定。数据行上的锁标志一旦被置位,就表明该数据行被加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)之间还可以组合出新的锁类型,理论上可以组合出四种,即S+IS, S+IX, X+IX, X+IX, 但稍微分析不难看出,实际上只有S+IX有新的意义,其他三种组合都没有是锁的强度提高(即:S+IS=SX+IS=XX+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锁),与上面提到的SXISIXSIX相对应。

需要注意的是,由于Oracle在行级只提供X锁,所以与RS锁(通过SELECT … FOR UPDATE语句获得)对应的行级锁也是X锁(但是该行数据实际上还没有被修改),这与理论上的IS锁是有区别的。

 

下表为Oracle数据库TM锁的相容矩阵(Y=Yes,表示相容的请求; N=No,表示不相容的请求;-表示没有加锁请求):

 

        T2

T1

S

X

RS

RX

SRX

-

S

Y

N

Y

N

N

Y

X

N

N

N

N

N

Y

RS

Y

N

Y

Y

Y

Y

RX

N

N

Y

Y

N

Y

SRX

N

N

Y

N

N

Y

-

Y

Y

Y

Y

Y

Y

表一:Oracle数据库TM锁的相容矩阵

 

一方面,当Oracle执行SELECT…FOR UPDATEINSERTUPDATEDELETEDML语句时,系统自动在所要操作的表上申请表级RS锁(SELECT…FOR UPDATE)或RX锁(INSERTUPDATEDELETE),当表级锁获得后,系统再自动申请TX锁,并将实际锁定的数据行的锁标志位置位(指向该TX锁);另一方面,程序或操作人员也可以通过LOCK TABLE语句来指定获得某种类型的TM锁。下表总结了Oracle中各SQL语句产生TM锁的情况:

 

SQL语句

表锁模式

允许的锁模式

Select * from table_name……

RSRXSSRXX

Insert into table_name……

RX

RSRX

Update table_name……

RX

RSRX

Delete from table_name……

RX

RSRX

Select * from table_name for update

RS

RSRXSSRX

lock table table_name in row share mode

RS

RSRXSSRX

lock table table_name in row exclusive mode

RX

RSRX

lock table table_name in share mode

S

RSS

lock table table_name in share row exclusive mode

SRX

RS

lock table table_name in exclusive mode

X

表二:Oracle数据库TM锁小结

 

我们可以看到,通常的DML操作(SELECT…FOR UPDATEINSERTUPDATEDELETE),在表级获得的只是意向锁(RSRX),其真正的封锁粒度还是在行级;另外,Oracle数据库的一个显著特点是,在缺省情况下,单纯地读数据(SELECT)并不加锁,Oracle通过回滚段(Rollback segment)来保证用户不读“脏”数据。这些都极大地提高了系统的并发程度。

由于意向锁及数据行上锁标志位的引入,极大地减小了Oracle维护行级锁的开销,这些技术的应用使Oracle能够高效地处理高度并发的事务请求。

0 0
原创粉丝点击