提问者:小点点

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


一致性的定义:

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

读取一致性的定义:

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

我很困惑,读一致性似乎是一种隔离,但不是一致性。是真的吗?


共1个答案

匿名用户

没错,但是这些概念是相关的,而且可能有点混淆。

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

<罢工> “读取一致性”是“事务隔离”级别之一,它描述了好的并发事务如何相互隔离(即它们可以在多大程度上将数据库视为只在其上工作)。 罢工

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

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

我认为这比READ COMMITTED更有保证(您看不到任何尚未提交的内容——没有脏读——但您也看不到查询开始后已提交的任何内容)。

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

据我所知,READ UNCOMMITTED在Oracle中不可用。这可能就是他们所说的“Oracle始终强制执行语句级读取一致性”的意思。