设为首页 收藏本站
查看: 470|回复: 0

[经验分享] Oracle数据库锁

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-3-11 09:55:35 | 显示全部楼层 |阅读模式
为了确保并发用户在存取同一数据库对象时的正确性(即无丢失修改、可重复读、不读

“脏”数据),数据库中引入了锁机制。基本的锁类型有两种:排它锁(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 锁,那么该锁的申请也应被阻塞。

如果表中的数据很多,逐行检查锁标志的开销将很大,系统的性能将会受到影响。为了解决

这个问题,可以在表级引入新的锁类型来表示其所属行的加锁情况,这就引出了“意向锁”

的概念。

意向锁的含义是如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁;对任

一结点加锁时,必须先对它的上层结点加意向锁。如:对表中的任一行加锁时,必须先对它

所在的表加意向锁,然后再对该行加锁。这样一来,事务对表加锁时,就不再需要检查表中

每行记录的锁标志位了,系统效率得以大大提高。

2.2.2 意向锁的类型

由两种基本的锁类型(S锁、X 锁),可以自然地派生出两种意向锁:

意向共享锁(Intent Share Lock,简称 IS 锁):如果要对一个数据库对象加S锁,首先

要对其上级结点加IS 锁,表示它的后裔结点拟(意向)加 S锁;

意向排它锁(Intent Exclusive Lock,简称 IX 锁):如果要对一个数据库对象加X 锁,

首先要对其上级结点加 IX锁,表示它的后裔结点拟(意向)加X 锁。

另外,基本的锁类型(S、X)与意向锁类型(IS、IX)之间还可以组合出新的锁类型,

理论上可以组合出4种,即:S+IS,S+IX,X+IS,X+IX,但稍加分析不难看出,实际上只

有 S+IX 有新的意义,其它三种组合都没有使锁的强度得到提高(即:S+IS=S,X+IS=X,

X+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 锁),与上面提到的S、X、IS、IX、SIX 相对应。需要注意的是,由于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 UPDATE、 INSERT、 UPDATE、 DELETE等 DML

语句时,系统自动在所要操作的表上申请表级RS锁(SELECT…FOR UPDATE)或 RX锁

(INSERT、UPDATE、DELETE),当表级锁获得后,系统再自动申请 TX 锁,并将实际锁

定的数据行的锁标志位置位(指向该TX锁);另一方面,程序或操作人员也可以通过 LOCK

TABLE 语句来指定获得某种类型的TM锁。下表总结了 Oracle中各 SQL语句产生 TM锁的

情况:

SQL语句 表锁模式 允许的锁模式

Select * from table_name…… 无 RS、RX、S、SRX、X

Insert into table_name…… RX RS、RX

Update table_name…… RX RS、RX

Delete from table_name…… RX RS、RX

Select * from table_name for update RS RS、RX、S、SRX

lock table table_name in row share mode RS RS、RX、S、SRX

lock table table_name in row exclusive mode RX RS、RX

lock table table_name in share mode S RS、S

lock table table_name in share row exclusive mode SRX RS

lock table table_name in exclusive mode X 无

表二:Oracle 数据库 TM 锁小结



我们可以看到,通常的 DML 操作(SELECT…FOR UPDATE、INSERT、UPDATE、

DELETE),在表级获得的只是意向锁(RS或 RX),其真正的封锁粒度还是在行级;另外,

Oracle数据库的一个显著特点是,在缺省情况下,单纯地读数据(SELECT)并不加锁, Oracle

通过回滚段(Rollback segment)来保证用户不读“脏”数据。这些都极大地提高了系统的

并发程度。

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


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-15736-1-1.html 上篇帖子: oracle数据库存储过程分页 下篇帖子: eclipse 连接Oracle Oracle 数据库
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表