为了确保并发用户在存取同一数据库对象时的正确性(即无丢失修改、可重复读、不读
“脏”数据),数据库中引入了锁机制。基本的锁类型有两种:排它锁(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 多粒度封锁机制的监控。
分享到:
相关推荐
### Oracle数据库锁机制详解 #### 一、引言 在Oracle数据库系统中,为了确保数据的一致性和事务处理的正确性,引入了锁机制。锁作为一种重要的并发控制手段,在多用户环境中防止多个事务同时访问同一资源导致的...
浅谈 Oracle 数据库锁的类型与机制 Oracle 数据库锁是指 Oracle 数据库中用于保护数据的一致性和完整性的机制。 Oracle 数据库锁可以分为五大类:DML 锁、DDL 锁、内部锁、分布式锁和 PCM 锁。 1. DML 锁(Data ...
Oracle数据库是一种广泛应用于企业级应用的关系型数据库管理系统,其在多用户并发访问环境中,为了保证数据的一致性和完整性,引入了锁的概念。锁是数据库管理系统中用于管理并发操作的重要机制,它确保在并发环境下...
### Oracle数据库性能分析 #### 一、Oracle体系结构 Oracle数据库是一个复杂且功能强大的关系型数据库管理系统(RDBMS),其核心组件包括实例和数据库文件。理解Oracle的体系结构对于优化性能至关重要。 - **实例**...
本资料“Oracle数据库精讲与疑难解析”旨在深入讲解Oracle数据库的核心概念、操作技巧以及解决常见问题的方法,帮助用户从初学者到熟练掌握Oracle数据库管理。 第一章:Oracle数据库基础 在这一章中,我们将学习...
Oracle2: 1. 《Oracle8 优化技术》摘录 (第一章 安装) 2. 《Oracle8 优化技术》摘录 (第二章 内存-CPU) 3. 《Oracle8 优化技术》摘录 (第三章 输入-输出) 4. EXP、IMP 命令详解 ...52. 自动备份Oracle数据库
Oracle采用多版本并发控制(MVCC)来处理多个事务同时访问数据的情况,理解锁和事务的概念有助于解决并发问题。 10. **存储结构** 学习Oracle的数据块、区、段和表空间之间的关系,理解物理存储的层次结构对于...
#### 一、Oracle数据库导入导出基础概念 在进行Oracle数据库的数据导入导出之前,我们先了解几个基本概念: - **导出(Export)**:指的是将数据库中的数据或者对象从Oracle数据库中提取出来,并保存为一个二进制...
Oracle数据库提供了锁机制和多版本并发控制(MVCC)等技术来实现事务和并发控制。 ### 数据库恢复和安全性 数据库系统在遇到系统故障或人为错误时必须能够恢复到某个一致的状态,这就需要数据库恢复技术的支持。...
#### Oracle数据库锁的概念 锁是一种用于控制多个用户或进程对共享资源(如表、行或数据库结构)访问的机制。它主要分为两大类:共享锁(Share Locks)和排他锁(Exclusive Locks)。共享锁允许多个用户读取数据,...
了解这些基本概念和流程,可以帮助初学者建立起对Oracle数据库的初步认识,为进一步深入学习和实践打下坚实基础。在实际操作中,还需要掌握SQL语法、表和索引的创建、权限管理、性能优化等相关知识。随着经验的积累...
Oracle数据库系统是全球广泛使用的大型关系型数据库管理系统之一,它为各类企业和组织提供了高效、安全的数据存储和管理解决方案。这个《Oracle数据库系统》多媒体课件是深入学习Oracle技术的宝贵资源,涵盖了从基础...
### Oracle数据库系统管理与运维知识点概述 #### 一、课程背景与目标 - **课程背景**:随着信息技术的发展,数据库已成为现代信息系统的核心组成部分。Oracle数据库因其高性能、高可靠性等特点,在企业级应用中占据...
从给定的文件信息来看,这是一本关于Oracle数据库的案例教程,主要面向初学者,旨在通过实际案例和练习帮助读者掌握Oracle数据库的基础知识和操作技能。以下是对该教程涉及的关键知识点的详细解读: ### Oracle...
本课程主要介绍了ORACLE数据库的基本概念和结构,包括ORACLE数据库的体系结构、内存结构、实例、会话、事务、后台进程、SQL语句执行过程等。 一、Oracle 体系结构 ORACLE数据库的体系结构主要包括物理结构和逻辑...
事务处理是数据库管理中的关键概念,涉及事务的属性如原子性、一致性、隔离性和持久性,以及锁机制、提交事务、回退事务和只读事务等内容。这部分内容帮助学习者理解如何保证数据库操作的准确性和一致性。 在Oracle...
以下是一些关键的Oracle数据库命令和概念,以及如何在不同的环境下连接到Oracle数据库。 1. **启动数据库**: - `cd @ORACLE_HOME/bin`:切换到Oracle安装目录的bin子目录,这里包含了数据库服务的可执行文件。 -...