多用户环境下的数据并发访问及数据一致性简介

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

多用户环境下的数据并发访问及数据一致性简介

多用户环境下的数据并发访问及数据一致性简介

在只有单一用户的数据库中,用户可以任意修改数据,而无需考虑同时有其他用户正在修改相同的数据。但在一个多用户数据库中,多个并发事务中包含的语句可能会修改相同的数据。数据库中并发执行的事务最终应产生有意义且具备一致性的结果。因此在多用户数据库中,对数据并发访问(data concurrency)及数据一致性(data consistency)进行控制是两项极为重要的工作。

1、数据并发访问指多用户同时访问相同的数据。

2、数据一致性指系统中每个用户都能够取得具备一致性的数据,同时还能够看到自己或其他用户所提交的事务对数据的修改。

为了描述同时执行的多个事务如何实现数据一致性,数据库研究人员定义了被称为串行化处理(serializability)的事务隔离模型(transaction isolation model)。当所有事务都采取串行化的模式执行时,我们可以认为同一时间只有一个事务在运行(串行的),而非并发的。

以串行化模式对事务进行隔离的效果很好,但在此种模式下应用程序的效率将大大降低。将并行执行的事务完全隔离意味着即便当前只存在一个对表进行查询(query)的事务,其他事务也不能再对此表进行插入(insert)操作了。总之,为了满足实际要求,我们需要在事务的隔离程度与应用的性能之间找出一个平衡点。

Oracle 支持两种事务隔离级别(isolation level),使应用程序开发者在对事务进行控制时,既能保证数据的一致性,又能获得良好的性能。

需要防止的现象和事务隔离级别

ANSI/ISO SQL 标准(SQL92)定义了四种事务隔离级别(transaction isolation level),这四种隔离级别所能提供的事务处理能力各不相同。这些事务隔离级别是针对三种现象定义的,在并发事务执行时,需要阻止这三种现象中的一种或多种发生。

三种需要阻止的现象(preventable phenomena)是:

1、脏读取(dirty read):一个事务读取了被其他事务写入但还未提交的数据。

2、不可重复读取(nonrepeatable read):一个事务再次读取其之前曾经读取过的数据时,发现数据已被其他已提交的事务修改或删除。

3、不存在读取(phantom read):事务按照之前的条件重新查询时,返回的结果集中包含其他已提交事务插入的满足条件的新数据。

SQL92 标准中定义了四个隔离级别,在各隔离级别中,允许发生上述三种需要阻止的现象中的一种或多种。详情见下表 现

象 隔离级别

脏读取

不可重复读取 不存在读取 未提交读取(read

uncommitted )

允许

允许 允许 已提交读取(read committed )

不允许 允许 允许 可重复读取(repeatable read )

不允许 不允许 允许 串行化(rerializable )

不允许 不允许 不允许

Oracle 支持三种事务隔离级别:已提交读取,串行化,以及 SQL92 中没有包含的只读模式(read-only mode )。已提交读取是 Oracle 默认使用的事务隔离级别。

Oracle 如何管理数据并发访问及数据一致性

Oracle 利用多版本一致性模型(multiversion consistency model ),各种类型的锁及事务来管理多用户系统中的数据一致性(data consistency )。 多版本并发访问控制

Oracle 能够自动地实现一个查询的读一致性,即一个查询所获得的数据来自同一时间点(single point in time )(这也被称为语句级读一致性

(statement-level read consistency ))。Oracle 还能令一个事务内的所有查询都具备读一致性(即事务级读一致性(transaction-level read consistency ))。

Oracle 利用回滚段中的信息生成一个能保证一致性的数据视图。回滚段内保存了未提交或最近提交的事务中所修改数据的原值。下图展示了 Oracle 如何利用回滚段实现语句级的读一致性。

在查询开始执行时,将记录当前的系统变化编号(system change number,SCN)。在图中,记录的系统变化编号为 10023。当查询进行扫描时,只会使用有效的(observed)数据块。如果某个数据块内的数据被修改过(即数据块的 SCN 晚于查询开始执行时记录的 SCN),Oracle 将使用回滚段中的信息重建此数据块,并以重建的数据块替代被修改的数据块供查询使用。因此,查询的结果集只包含查询开始执行时就已经提交的数据。在查询执行时,其他事务修改的数据对此查询来说是无效的,这保证了每个查询都能得到满足一致性的数据。

语句级读一致性

Oracle 强制实现语句级读一致性(statement-level read consistency)。这保证了单一查询的结果集来自一个时间点——即查询开始执行的时间。因此,一个查询的结果集永远不会包含脏数据及此查询执行时其他事务提交的数据。在一个查询执行期间,只有在查询执行前提交的数据对此查询才是可见的。查询无法看到其开始执行后提交的数据。

任何一个查询都能得到满足一致性的结果集,这保证了用户无需额外操作就能确保数据一致性。 SELECT ,使用子查询的 INSERT ,及包含显式或隐式查询的 UPDATE 或 DELETE 语句,都能够保证数据一致性。上述语句通过一个查询(query)来得到她们所需的满足一致性的结果集(分别使用 SELECT,INSERT,UPDATE 或 DELETE 语句)。

SELECT 语句是一个显式地查询,且其中可以包含嵌套查询(nested query)或连接操作(join operation)。 INSERT 语句中也能够使用嵌套查询。 UPDATE

相关文档
最新文档