Oracle数据并发和一致性简介

整理自Oracle 11g R2 官方文档《concepts》

001 简介

    在单用户的数据库中,用户可以修改数据,而不用担心其它用户在同一时间修改相同的数据。但是,在一个多用户的数据库中,多个事务内的语句可以同时更新相同的数据。同时执行的多个事务必须产生有意义且一致的结果。因此,多用户数据库必须提供以下功能:

    ·数据并发性:确保多个用户可以同时访问数据

    ·数据一致性:确保每个用户看到数据的一致的视图,包括可以看到用户自己的事务所做的更改,和其它用户已提交的事务所做的更改。

    

    为描述当多个事务同时运行时的事务一致性行为,数据库研究人员定义了一种称为可串行性的事务隔离模型。可串行化事务在一种使其看起来好像没有其他用户正在修改数据库中的数据的环境中运作。

    虽然事务之间的这种隔离度好像不错, 但在可序列化模式下运行许多应用程 序可能会严重影响应用程序吞吐量。对并发运行事务的完全隔离可能意味着一个事务无法在某个正在被另一个事务查询的表上执行插入操作。简而言之,现实的考虑通常需要在完美的事务隔离性和性能之间的一个折衷。

    Oracle 数据库通过使用多版本一致性模型和各种类型的锁和事务,来维护数据的一致性。通过这种方式,数据库可以向多个并发用户呈现一个数据的视图,每个视图都在某个时间点上是一致的。因为不同版本的数据块可以同时存在,事务可以读取在某个查询请求时间点上的已提交版本数据,并返回符合一个单一时间点的结果。

002 多版本读一致性

    在Oracle数据库中,多版本即同时实现数据的多个版本的能力。Oracle数据库维护多版本读取一致性,这意味着数据库查询具有以下特征:

    ·读一致查询

    查询所返回的数据已提交的, 且关于某个单一时间点一致。Oracle 数据库绝不允许脏读。当一个事务读取了另一个事务中未提交的数据时,会发生脏读。为说明脏读的问题, 假设一个事务更新某列的值,但不提交。第二个事务读取此已更新的脏(未提交)值。第一个会话回滚了事务,使该列仍具有其旧值,但第二个事务继续使用更新的值, 这会损坏数据库。脏读会破坏数据的完整性、破坏外键、和忽略唯一约束。

    ·非阻塞查询

    数据的读取者和写入者不会相互阻塞。    

003 语句级读取一致性

    Oracle 数据库始终强制执行语句级读取一致性,保证单个查询所返回的数据是已提交的、且关于某个单一时间点一致。 单个SQL 语句所一致的时间点取决于事务的隔离级别和查询的性质:

    · 在读提交隔离级别,该时间点是语句打开的时间。例如,如果一个SELECT 语句在SCN 1000 时打开,则此语句一致于SCN 1000。

    · 在可串行化或只读事务隔离级别,该时间点为事务开始的时间。例如,如果一个事务开始于SCN 1000,且在该事务中有多个SELECT 语句发生,则每个语句都一致于 SCN 1000。

    · 在闪回查询操作(SELECT ... AS OF)中,SELECT 语句显式指定时间点。例如,你可以查询某个表在上星期四下午2时的数据。

    

004 事务级读取一致性

    Oracle 数据库还可以为一个事务中的所有查询提供读取一致性,这称为事务级读取一致性。在这种情况下,事务中的每个语句都看到来自同一时间点(即该事务开始的时间)的数据。在一个可序列化事务中的多个查询,能看到事务本身所做的更改。例如,某 个事务更新了 employees 表,然后其后续查询将看到对 employees 所做的更新。事务级读取一致性产生可重复的读取,且不会产生幻读。

005 读取一致性及undo段

    为管理多版本的读取一致性模型,当表同时被查询和更新时, 数据库必须创建一组读取一致的数据。Oracle 数据库通过使用undo数据实现了这一目标。
    每当用户修改了数据,Oracle 数据库会创建撤销条目,并写入到undo段。undo段包含由未提交事务或最近提交的事务所更改的数据的旧值。因此,同一数据在各个不同时间点上的多个版本,都可以存在于数据库中。数据库可以使用在不同时间点的数据快照,来提供数据读取一致视图,并实现非阻塞查询。
    读取一致性在单实例和Oracle 真正应用集群(Oracle RAC)环境中都可以得到保证。Oracle RAC 使用一种称为缓存融合的“缓存到缓存”的数据块传输机制,将一个数据库实例中的数据块读取一致映像传送到另一个实例中。

006 读一致性示例

    下图显示了一个查询,在已提交读隔离级别使用undo数据以提供语句级的读取一致性。

图 1 在已提交读隔离级别的读取一致性

    当数据库为某个查询检索数据块时,数据库确保每个块中的数据反映了该查询开始时的内容。数据库根据需要回滚对数据块所做的更改,以将块重建到 查询处理开始的状态。

    数据库使用一种称为SCN 的机制,来保证事务的顺序。当SELECT 语句进入执行阶段时,数据库会确定查询开始执行时所记录的SCN。在上图中,该SCN 为10023。在事务中的每个查询必须返回在SCN 10023 时的已提交数据。

    在图1中,其SCN 大于10023 的块具有已更改数据,如图1中的两个具有SCN 10024 的块所示。SELECT 语句需要一个与已提交更改块一致的版本。该数据库将当前数据块复制到新的缓冲区,并应用撤消数据,以重新构造块的早期版本。这些重建的数据块被称为一致性读取 (CR) 克隆。

    在图1中,数据库创建了两个CR 克隆:一个块与SCN 10006 一致,而另一个块与SCN 10021 一致。数据库为查询返回重建的数据。通过这种方式,数据库可以防止脏读。

    

007 读一致性和事务表

    数据库使用一个事务表,也称感兴趣事务列表 (ITL) 来确定当数据库开始修改块时是否某个事务还未提交。每个段块的块头包含一个事务表。

    事务表中的条目描述了哪些事务有被锁定的行,以及块中的哪些行包含提交和未提交的更改。事务表指向undo段,提供对数据库所做的更改的时间相关信息。

    在某种意义上,块头包含影响块中每个行的事务的最近历史记录。CREATE TABLE 和ALTER TABLE 语句的NITRANS 参数,控制被保留的事务历史记录条数。

008 锁定机制

    通常,多用户数据库使用某种形式的数据锁定,来解决与数据并发性、一致性、和完整性相关的问题。 锁是防止访问同一资源的事务之间的破坏性相互作用的机制。

009 ANSI/ISO 事务隔离级别

    已由ANSI 和ISO/IEC 采纳的SQL 标准,定义了四个事务隔离级别。这些级别对事务处理吞吐量有不同程度的影响。
这些隔离级别根据在同时运行的事务之间必须防止的现象来定义。可预防的现象有:
    ·脏读
    一个事务读取了已被另一个事务写入、但尚未提交的数据。
    ·不可重复(模糊)读
    一个事务重新读取之前曾经读取过的数据,发现另一个已提交的事务已修改或删除了该数据。例如,用户查询某行,然后稍后又查询相同的行,却发现数据已更改。
    ·幻像读
    一个事务重新运行满足某搜索条件的查询,并返回一个行集,发现另一个已提交的事务已插入了满足搜索条件的其他行。
    例如,一个事务查询雇员数目。五分钟后它执行相同的查询,但现在人数却增加了一个,这是因为另一个用户为一名新员工插入了一条记录。满足查询条件的数据比之前更多了,但与不可重复读不同,之前读取的数据不会变化。
根据运行在某个特定的隔离级别的事务所允许发生的现象,SQL 标准定义了四个隔离级别。表9-1 显示了这些级别。


Oracle 数据库提供了已提交读(默认值)和可串行化隔离级别。另外,数据库也可以提供一种只读模式。

时间: 2024-08-01 02:02:01

Oracle数据并发和一致性简介的相关文章

oracle数据块如何进行一致性检查

什么是数据块一致性? 每一个数据块头部都有一个"校验和"字段 当数据块被写回磁盘前,Oracle会重新计算这个校验和 并记录到这个字段,最终写回磁盘 下次数据块被读入内存时,Oracle会重新计算数据块的校验和 并与校验和字段中的值相比较 如果有差异,Oracle就会抛出ORA-1578 也就是,整个校验过程: 写回时,计算并保存 读入时,计算并比较 通过校验和字段进行检查叫物理一致性检查,其侧重于硬件故障,并不关心内容正确与否 而逻辑一致性检查便是接手这任务,如:记录和索引是否对应:

【体系结构】Oracle数据块详解

Oracle数据块详解 操作系统块是操作系统读写的最小操作单元,也是操作系统文件的属性之一.当创建一个Oracle数据库时,选择一个基于操作系统块的整数倍大小作为Oracle数据库块的大小.Oracle数据库读写操作则是以Oracle块为最小单位,而非操作系统块. 数据库块也称逻辑块或Oracle块,它对应磁盘上一个或多个物理块,它的大小由初始化参数DB_BLOCK_SIZE决定,可以定义数据块为2K.4K.8K.16K.32K甚至更大,默认Oracle块大小是8K.若一旦设置了Oracle数据

oracle多用户并发及事务处理

多用户并发访问 事务:作用于某些数据的一个不可分割的操作 锁:写锁.互斥锁(仅能被一个进程使用) 读锁.共享锁(可被多个进程使用) 更新丢失 脏读 不可重复读 幻影读 隔离级别: 1 READ COMMITTED 每个语句得到完整的视图 2 SERIALIZABLE 事务级别实施串行化 Oracle并发特性 1 回滚段:存储"撤销"信息的数据结构 redo日志用来记录数据库的所有事务:回滚段用于提供事务回滚和读一致性 2 系统改变号 SCN:保证事务执行的顺序 3 数据块中的锁:每个锁

DataSet的数据并发异常处理

数据|异常处理 摘要:ADO.NET为提高数据密集型(data-intensive)应用程序的性能.简化这类程序的建立过程提供了多种技术.数据集(DataSet)作为ADO.net对象模型的标志,作为一个微型的.不连接(disconnected)的数据源的副本提供服务.虽然使用数据集通过减少对数据库服务器的高花费的访问而提高了性能,但是它也带来了多个用户试图同时访问相同数据的可能性,由此引起数据并发性异常(data concurrency exception).本文调查了数据并发性异常背后的通常

HTAP数据库 PostgreSQL 场景与性能测试之 24 - (OLTP) 物联网 - 时序数据并发写入(含时序索引BRIN)

标签 PostgreSQL , HTAP , OLTP , OLAP , 场景与性能测试 背景 PostgreSQL是一个历史悠久的数据库,历史可以追溯到1973年,最早由2014计算机图灵奖得主,关系数据库的鼻祖Michael_Stonebraker 操刀设计,PostgreSQL具备与Oracle类似的功能.性能.架构以及稳定性. PostgreSQL社区的贡献者众多,来自全球各个行业,历经数年,PostgreSQL 每年发布一个大版本,以持久的生命力和稳定性著称. 2017年10月,Pos

Oracle高并发系列2:事务日志写入引发的Redo log风波

作者介绍 王鹏冲,平安科技数据库技术专家,浸淫数据库行业十多年,对Oracle数据库有浓厚兴趣,也对MySQL.MongoDB.Redis等数据库有一定架构和运维经验,目前正沉迷在PostgreSQL数据库与Oracle数据库的PK之中,重点在关系型数据库的分布式架构研究.   引言   关系型数据库强调事务的ACID特性,对于事务的持久性,主流的关系型数据库都是通过写事务日志来实现的.写数据是随机IO,写日志是顺序IO,常规的机械磁盘,随机IO比顺序IO要昂贵很多.所以虽然写日志同样要刷到磁盘

Oracle数据操作和控制语言详解_oracle

正在看的ORACLE教程是:Oracle数据操作和控制语言详解.SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML, 数据定义语言DDL,数据控制语言DCL.其中用于定义数据的结构,比如 创建.修改或者删除数据库:DCL用于定义数据库用户的权限:在这篇文章中我将详细讲述这两种语言在Oracle中的使用方法.  DML语言 DML是SQL的一个子集,主要用于修改数据,下表列出了ORACLE支持的DML语句. 插入数据 INSERT语句常常用于向表中插入行,行中可以有特殊数据字段,或者可

探索ORACLE之RMAN_04非一致性备份

探索ORACLE之RMAN_04非一致性备份 作者:吴伟龙   在上一篇博文中提到了数据库的一致性备份,操作非常的简单.只需要一条很短的命令即可完成,但是如果要创建一正式库的备份,一般不建议用一致性备份,也不建议用很简单的名来完成.而是更多的采用脚本实现非一致性备份,这样将可通过backup+archive log+redo有效的将数据恢复到最近一次改变的状态,可以达到数据的丢失最小化. 创建非一致性备份  创建非一致性备份数据库必须处于归档(archivelog)模式,因为非一致性备份的数据库

Oracle数据块实现原理深入解读_oracle

下午在学习oracle 10g r2 concepts 在这留一笔. Oracle对数据库数据文件(datafile)中的存储空间进行管理的单位是数据块(data block).数据块是数据库中最小的(逻辑)数据单位.与数据块对应的,所有数据在操作系统级的最小物理存储单位是字节(byte).每种操作系统都有一个被称为块容量(block size)的参数.Oracle每次获取数据时,总是访问整数个(Oracle)数据块,而不是按照操作系统块的容量访问数据. 数据库中标准的数据块(data bloc