日期:2014-05-16  浏览次数:20413 次

11gr2 oracle concepts(翻译) --第九章 数据并发和一致性

9 数据并发和一致性

主要内容包括

数据并发和一致性的简介

事务隔离级别

数据库锁机制

锁的自动实现

手工管理锁

用户定义的锁

9.1  数据并发和一致性的简介

多用户并发的数据库环境必须符合如下要求

1,数据并发:用户可以同时从数据库获取数据

2,数据一致性:每个用户会看到数据的一致性视图,包括自己事务内的修改的数据和其它用户已经提交的事务修改

为了描述并发时的事务的一致性,数据库研究人员定义了一个叫做串行化(serializability)的事务隔离模型。在数据库中,串行的事务操作可以确保看起来没有其它用户在修改数据

串行化的事务会影响高并发的数据库性能,串行的完全隔离意味着当一个事务查询表中数据时,不允许其它事务插入数据。简单来说,现实世界中,需要在事务隔离和性能之间取得平衡。

Oracle数据库使用多版本的一致性模型,锁机制和事务实现数据一致性。通过这种方法,数据库能提供给所有并发用户在某个时间点的一致性视图。由于同时存在多个版本的数据块,事务能够提供查询所需的某个时间点的数据版本

9.1.1  多版本的读一致

Oracle中,多版本(multiversioning)是同时提供多个数据版本,oracle提供多个版本的数据一致性,这意味着数据库查询具有如下特性

读一致性查询

查询出来的数据是一个时间点的一致视图

重要:oracle不允许脏读(dirty reads),脏读是指视图读取到了另一个事务未提交的数据。脏读会带来如下类似的问题,假设一个事务更新了一列的数值,且没有提交,第二个事务读到了这个更新的脏数据,第一个事务回滚了相关数据,而第二个事务继续处理了更新的数据,这就会给数据库带来很大的破坏。脏读违反了数据一致性、和外键约束等

非阻塞查询

  读操作和写操作不会相互阻塞

9.1.1.1       语句级别的读一致性

oracle确保语句级别的数据一致性,能够保证查询返回某个时间点的所有提交的一致性数据。一致性的时间点取决于事务隔离级别和sql的内容

1,在提交读隔离级别(read committed isolation level),返回数据的时间点就是查询开始的时间。

2,在串行和只读事务(serializable or read-only transaction),数据一致性的时间点是事务开始的时间

3闪回查询(Flashback Query)中(SELECT ... AS OF),select语句明确制定了一致性时间点

9.1.1.2       事务级别的读一致性

oracle也提供事务级别的读一致性,事务内的所有查询都能够查询到事务开始时间点的一致性数据。本事务内修改的数据,事务内查询可以看到。例如事务修改了employees表,接下来的查询会看到这个更新。事务级别的读一致性不会带来重复读(repeatablereads)问题,不会带来幻影读(phantom reads)

9.1.1.3       读一致性和undo

为了多版本读一致性模型,当表被并发查询和更新时,数据库需要创建一系列的读一致性数据,oracle是通过undo来实现的。当用户修改数据时,oracle往undo段中写入undo实体(undo entries),undo段中存储没提交的事务或者最近已提交事务中的被修改的旧数据。数据库存在对同一个数据,在不同时间点的多个版本,数据库能够根据不同时间点的数据快照,提供给查询读一性视图,而不用阻塞查询。在单实例和rac环境下,都能保证读一致性。rac在不同实例之间使用cache-to-cache数据块传输机制,也就是cache fushion的方式传输数据块的读一致性镜像

9.1.1.3.1  读一致性的例子

图9-1是通过undo在read committed隔离级别实现语句级别的读一致性

Figure 9-1