oracle 隔离性(isolation)

  数据库事务(ACID)中的I指隔离性(isolation):未完成的(也就是未提交的)事务必须不可视。在某个事务进行期间,只有执行该事务的一个会话能看到所做的变化。

  oracle是通过使用还原段来实现隔离性的。还原段(undo)的目的:(1)事务恢复;(2)事务回滚;(3)读一致性

代码
SQL>select name,value from v$parameter where name like '%undo%';

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居然可以看到更新的值。直至,了解到撤销段和重定向的使用的时候,才解惑了。

原文地址:https://www.cnblogs.com/gobird/p/1914885.html