日期:2014-05-16 浏览次数:20405 次
9 数据并发和一致性
主要内容包括
数据并发和一致性的简介
事务隔离级别
数据库锁机制
锁的自动实现
手工管理锁
用户定义的锁
9.1 数据并发和一致性的简介多用户并发的数据库环境必须符合如下要求
1,数据并发:用户可以同时从数据库获取数据
2,数据一致性:每个用户会看到数据的一致性视图,包括自己事务内的修改的数据和其它用户已经提交的事务修改
为了描述并发时的事务的一致性,数据库研究人员定义了一个叫做串行化(serializability)的事务隔离模型。在数据库中,串行的事务操作可以确保看起来没有其它用户在修改数据
串行化的事务会影响高并发的数据库性能,串行的完全隔离意味着当一个事务查询表中数据时,不允许其它事务插入数据。简单来说,现实世界中,需要在事务隔离和性能之间取得平衡。
Oracle数据库使用多版本的一致性模型,锁机制和事务实现数据一致性。通过这种方法,数据库能提供给所有并发用户在某个时间点的一致性视图。由于同时存在多个版本的数据块,事务能够提供查询所需的某个时间点的数据版本
Oracle中,多版本(multiversioning)是同时提供多个数据版本,oracle提供多个版本的数据一致性,这意味着数据库查询具有如下特性
读一致性查询
查询出来的数据是一个时间点的一致视图
重要:oracle不允许脏读(dirty reads),脏读是指视图读取到了另一个事务未提交的数据。脏读会带来如下类似的问题,假设一个事务更新了一列的数值,且没有提交,第二个事务读到了这个更新的脏数据,第一个事务回滚了相关数据,而第二个事务继续处理了更新的数据,这就会给数据库带来很大的破坏。脏读违反了数据一致性、和外键约束等
非阻塞查询
读操作和写操作不会相互阻塞
oracle确保语句级别的数据一致性,能够保证查询返回某个时间点的所有提交的一致性数据。一致性的时间点取决于事务隔离级别和sql的内容
1,在提交读隔离级别(read committed isolation level),返回数据的时间点就是查询开始的时间。
2,在串行和只读事务(serializable or read-only transaction),数据一致性的时间点是事务开始的时间
3,闪回查询(Flashback Query)中(SELECT ... AS OF),select语句明确制定了一致性时间点
oracle也提供事务级别的读一致性,事务内的所有查询都能够查询到事务开始时间点的一致性数据。本事务内修改的数据,事务内查询可以看到。例如事务修改了employees表,接下来的查询会看到这个更新。事务级别的读一致性不会带来重复读(repeatablereads)问题,不会带来幻影读(phantom reads)
为了多版本读一致性模型,当表被并发查询和更新时,数据库需要创建一系列的读一致性数据,oracle是通过undo来实现的。当用户修改数据时,oracle往undo段中写入undo实体(undo entries),undo段中存储没提交的事务或者最近已提交事务中的被修改的旧数据。数据库存在对同一个数据,在不同时间点的多个版本,数据库能够根据不同时间点的数据快照,提供给查询读一性视图,而不用阻塞查询。在单实例和rac环境下,都能保证读一致性。rac在不同实例之间使用cache-to-cache数据块传输机制,也就是cache fushion的方式传输数据块的读一致性镜像
图9-1是通过undo在read committed隔离级别实现语句级别的读一致性
Figure 9-1