数据库事务(ACID)中的I指隔离性(isolation):未完成的(也就是未提交的)事务必须不可视。在某个事务进行期间,只有执行该事务的一个会话能看到所做的变化。
oracle是通过使用还原段来实现隔离性的。还原段(undo)的目的:(1)事务恢复;(2)事务回滚;(3)读一致性
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
SQL>select name,value from v$parameter where name like '%undo%';
NAME VALUE
------------------------------ ------------------------------
undo_management AUTO
undo_tablespace UNDO
undo_retention 900
NAME VALUE
------------------------------ ------------------------------
undo_management AUTO
undo_tablespace UNDO
undo_retention 900
下面通过update的过程来分析隔离性的实现。
首先,在DML操作影响的所有记录以及关联索引键上放置锁定;接下来会生成重做,此时服务器进程在日志缓冲区中写入即将应用于指定数据块的变化。这个重做生成操作应用于数据块的变化和撤销块的变化,如果列是索引的一部分,也将索引的变化以及保护索引变化的撤销块变化写入日志缓冲区。在生成重做后,完成(1) (2)操作。然后,如上图片如示进行。
PS:我开始的时候一直不能理解隔离性,即如果没有commit的话,只有执行update的session才能看到变化,其它的session还是看到原来的值。更疑惑的是,当执行commit(只会触发LGWR,并不会触发DBWR)的时候,数据并没有真正写入db files,而其它的session居然可以看到更新的值。直至,了解到撤销段和重定向的使用的时候,才解惑了。