理解锁和闩(2)锁机制概述

上一篇 / 下一篇  2012-10-22 15:40:10 / 个人分类:数据库

51Testing软件测试网#p'Z~:_+f

  锁(lock)是一种防止多个事务访问同一资源时产生破坏性的相互影响的机制。通常,高并发数据库需要利用锁机制解决数据并发访问、一致性及完整性问题。

mbP2I_ Hc051Testing软件测试网J%|3G Y*u _

  前面提到的资源(resource)大致可以分为两类:

[Yl#^-KC051Testing软件测试网 f0a&Ji d9D/}Q*c

  ● 用户对象:例如表及数据行

&Fn6e0k7f051Testing软件测试网 cw'xhe^l

  ● 对用户透明的系统对象:例如内存中的共享数据结构、数据字典中的信息

;`ClJFYt'eA-E0

;I/B"I Q'XD@8N.E`0  任何SQL语句执行时Oracle都隐式地对 SQL 所需的锁进行管理,因此用户无需显式地对资源加锁。Oracle 默认采用的锁机制能尽可能地减小对数据访问的限制,在保证数据一致性的同时实现高度的数据并发性。Oracle也支持用户手工加锁的操作。

7V}|X3u051Testing软件测试网c[ n'e$oouk

  锁的类型

A1?%g*z w,E7x051Testing软件测试网(z@H-Yn

  分法很多,在此列二:

k y0c/V(d b5{/N.x0

sI'l^3|-}c`q0  按数据类型分51Testing软件测试网A_;JL~T,V

51Testing软件测试网v%{9I K#I\1}3C

  ① 保护元数据 --->TM锁(表级锁)

,ADklQI"\d@ej0

,Tq"vQ5q(y0  表级锁有5个,重要的有2个:lmode  type  (v$lock查询)51Testing软件测试网1z%H!NMmgz6zJ

qEU{N-b*}k;|5P0        3      RX

3`|A(~a \@b051Testing软件测试网v}kbmo#U

        6       X51Testing软件测试网*|f-AWmt5V-Mc&s

5{?1x5P#w"w0  ② 保护数据 --->TX锁(事务锁)51Testing软件测试网![I3| u#`7f-D/}

#h-{v,G;F(G0D)d0  一个事务对应一个事务锁(TX),并且其是因为行级锁(X)产生的。有行级锁就有事务锁。所以一个事务开始至少会有3个锁:TX、X、RX

D5F Pl+e/\0

Kw4zl4@5S.~0  按作用类型分

+J `/uCrGK051Testing软件测试网r'\3Nl cN-r7V W]7~c

  ① 保护chain --->lock

CS3D"fi m0

Z#L8f?)E"G.BCL2i [0  ② 保护buffer --->latch

/M4S s6W Ujd^0

Q!N{E,~Yt$R"x0  锁的模式51Testing软件测试网Y.[-W{1^c;?

51Testing软件测试网 P8M9\ xirF?.kCG

  在高并发环境,oracle采取两种模式的锁:51Testing软件测试网^4RY XP A;Y

8E@GgG:^0  (一)X模式(排他锁模式):对数据进行修改时必须获得此种模式的锁。第一个排他地对资源加锁的事物是唯一可以对此资源进行修改的事物,直至排他锁被释放。51Testing软件测试网?#Cj"F,p!ruu

#bq u {'G5RS0C0  (二)S模式(共享锁模式):对数据进行读取的多个用户可共享此数据,这些用户可以对资源加以共享锁,防止其他用户并发地修改此资源(对数据进行修改的用户需要排他锁)。多个事务可以对相同的资源加共享锁。51Testing软件测试网J)]7c*^]/b Y

"x s^(@-Nt0  锁的持续时间

tQ3C8f*`&n(Kr*u051Testing软件测试网F9}'pr lQwni

   事务内各语句获得的锁在事务执行期内有效,以防止事务间破坏性的相互干扰。如果某个事务中的 SQL 语句对数据进行了修改,只有在此事务提交后开始的事务才能看到前者修改的结果。当用户commit或者rollback一个事务时,Oracle 将释放此事务内各个 SQL 语句获得的锁。当用户在事务内回滚到某个保存点(savepoint)后,Oracle 也会释放此保存点后获得的锁。等待事务不会对可用资源加锁而是继续等待,直至拥有其所等待资源的事务完成提交或回滚。

*F~|I-c z lxoy`0

~3Bolq2w^m7DJ0  锁转换及锁升级

"?w;tfo,b0

)FW.S-On6k0  对于数据行来说,RX已经是限制程度最高的锁,因此无需再进行锁转换(lock conversion)。

{8^dlESZ051Testing软件测试网d2K-d2KU t

   对于数据表,Oracle 能够自动地将限制程度较低的锁转化为限制程度更高的锁。例如,某个事务内使用了SELECT ... FOR UPDATE 语句对数据行加锁。此时,事务获得了相关数据行上的行级锁X,及相关数据表上的RS。如果此事务将对某些数据行进行更新,那么之前获得的RS将自动地转换 为RX。

_N P4z,m ]t051Testing软件测试网"fuY [N5d

  锁升级(lock escalation)是指处于低粒度级别(例如,数据行级)上的锁被数据库升级为更高粒度级别(例如,表)上的锁。例如,某个用户已经对某个表内的多行 数据加锁,某些数据库管理系统会将用户的这些行级锁升级为一个单一的表级锁。此时系统内锁的数量减少了,对被锁资源的限制程度增加了。Oracle 数据库中不存在锁升级。锁升级将显著地增加发生死锁(deadlock)的可能性。例如,数据库试图将事务 T1 中对某资源的锁升级,同时事务 T2 也拥有此资源的锁。如果此时事务 T2 也需要将锁升级则将产生死锁。51Testing软件测试网 [MI'Fg,[gL#S

51Testing软件测试网Ne)hK2n&h;lrN#{

相关链接:

sE8a%s#` i051Testing软件测试网z:m vXUW-\ `t E:_

理解锁和闩(1)与锁相关的数据结构

{$\:e)[h3~q:I `0

TAG:

 

评分:0

我来说两句

Open Toolbar