Read Committed:
它是读提交数据,这是Oracle本身默认的一种隔离级别,也是SQL标准中的一种隔离方式,Oracle是利用多版本一致性模型来实现这种隔离级别的。
所谓的多版本一致性模式是指Oracle在修改任何一个数据块之前,必先在Undo空间中复制一个完全一致的数据库,并保留其原始的SCN。在进行数据库查询的时候,如果发现某个数据块的SCN比发起查询时的系统SCN还要大,它就判断为此数据库在此期望正在或已经被修改过,那么它会从Undo空间中去取相关的数据,从而实现读提交。
在已提交读取隔离模式下,Oracle能保证每个语句的事务集数据一致性。
读提交的实现方式:
Oracle事务提交过程:
复制UNDO数据
产生REDO数据
记录redo log和undo log的关联
将SGA中已读取到内存的数据修改为新的值
记录SCN值(System Change Number)
将在线重做日志记录(位于SGA的redo日志缓冲区中)持久化到redo日志文件
Oracle释放资源和锁
Oracle将事务标记为已结束
语句级读一致性:
Oracle强制实现语句级读一致性(statement-level read consistency)。
这保证了单一查询的结果集来自一个时间点,即查询开始执行的时间。因此,一个查询的结果集永远不会包含脏数据及此查询执行时其他事务提交的数据。在一个查询执行期间,只有在查询执行前提交的数据对此查询才是可见的。查询无法看到其开始执行后提交的数据。
SELECT语句是一个显式地查询,且其中可以包含嵌套查询(nested query)或连接操作(join operation)。
INSERT语句中也能够使用嵌套查询。
UPDATE及DELETE语句能够利用WHERE子句或子查询进行限制,只操作数据表内的部分数据行。
INSERT、UPDATE、DELETE语句中包含的查询能够获得一致性的结果集。这些查询无法看到其所在DML语句对数据的修改。
换句话说,这些查询只能看到其所在DML语句开始之前的数据。
函数级一致读:
如果SELECT列表中存在PL/SQL函数,那么函数中包含的SQL语句将遵从其自身的语句级读一致性,而非其所在SQL的读一致性。例如, SELECT语句中的某个函数访问的表可能会在语句执行时被其他事务修改并提交。此函数每次执行时都将建立一个新的一致性视图(snapshot)。