我是 Oracle 的新手,我只想确认我对 Oracle 10g 和 10g+ 的语句级读取一致性的理解。
Oracle 始终强制执行语句级读取一致性。这保证了单个查询返回的所有数据都来自一个时间点——查询开始的时间。因此,查询永远不会看到脏数据或查询执行期间提交的事务所做的任何更改。随着查询执行的进行,只有在查询开始之前提交的数据对查询可见。语句执行开始后,查询看不到已提交的更改。
Oracle 数据库始终强制执行语句级读取一致性,这保证了单个查询返回的数据已提交并且相对于单个时间点保持一致。单个 SQL 语句一致的时间点取决于事务隔离级别和查询的性质:
在读提交隔离级别中,这一点是语句打开的时间。例如,如果 SELECT 语句在 SCN 1000 打开,则该语句与 SCN 1000 一致。
在可序列化或只读事务中,这一点是事务开始的时间。例如,如果一个事务从 SCN 1000 开始,并且如果该事务中出现多个 SELECT 语句,则每个语句都与 SCN 1000 一致。
在闪回查询操作 (SELECT ... AS OF) 中,SELECT 语句明确指定时间点。例如,您可以查询上周四下午 2 点出现的表
见粗体字。如果我理解正确,Oracle 在 10g 和 10g+ 之间改变了它的行为。在 10g 中,Statement-Level Read Consistency 始终基于语句开始时的视图。在 10g+ 中,Statement-Level Read Consistency 基于依赖于隔离级别和查询本身的视图。我的理解正确吗?谢谢你。
行为没有改变。至少从 Oracle 7 开始(可能在此之前,但那是在我的时间之前)并且今天仍然是 Oracle 19 以来一直是相同的。文档只是被扩展为包括隔离级别的行为,而不是默认的 READ COMMITTED,或者当使用闪回查询机制。
(您真的应该查看最新的文档:https ://docs.oracle.com/en/database/oracle/oracle-database/index.html - 11g 非常旧)
重要的一点是,Oracle 使用的默认隔离(语句级一致性)意味着重复相同的语句可能不会提供相同的结果,因为其他事务可能在语句的第一次执行期间更新了数据。Oracle 使用多版本一致性来提供并发访问,这样读取器不会阻塞写入器,写入器不会阻塞读取器。