Oracle中读一致性与数据库ACID一致性之间的定义关系

时间:2014-06-04 08:20:45

标签: database oracle consistency acid

一致性的定义:

  

在数据库系统中,一致的事务是以处于一致状态的数据库开始并以数据库处于一致状态结束的事务。写入数据库的任何数据必须根据所有定义的规则有效,包括但不限于约束,级联,触发器及其任何组合。

读取一致性的定义:

  

Oracle始终强制执行语句级读取一致性。这可以保证单个查询返回的所有数据都来自单个时间点 - 查询开始的时间。因此,查询永远不会看到脏数据或在查询执行期间提交的事务所做的任何更改。

我感到困惑,似乎读一致性是隔离,而不是一致性。这是真的吗?

1 个答案:

答案 0 :(得分:2)

那是对的,但概念是相关的,而且可能会混淆一些。

"一致性" (如在ACID中)意味着当您更新数据库时,您不能将其置于不一致状态(数据库将强制执行所有约束)。

"阅读一致性"是"交易隔离"描述好的并发事务如何与彼此隔离的级别(即,它们可以对数据库进行多大程度的处理,就好像只对它们进行处理一样)。

好的,让我重新说一下。四个事务隔离级别描述了在同一事务中运行多个查询时会发生什么。这是一个可能更强的一致性。

"阅读一致性"您提到的是关于返回结果的单个查询,这些结果是内部一致的":它们表示在一个时间点(查询开始时)存在的数据。对于长时间运行的查询,您不会获得奇怪的结果。

我认为这比担心提供的保证要强一些(你没有看到任何尚未提交的内容 - 没有脏读 - 但你也看不到任何已经发生的事情在查询开始后提交。)

但这并不意味着您在五分钟后在同一事务中运行相同的查询时会得到相同的结果:您可能会看到平均时间内已更新(并已提交!)的数据。如果你不想要,你需要重复阅读。

据我所知,Oracle中没有READ UNCOMMITTED。这可能就是他们所说的" Oracle 总是强制执行语句级读取一致性"。