程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle檢索數據一致性與事務恢復

Oracle檢索數據一致性與事務恢復

編輯:Oracle數據庫基礎

Oracle為了保證用戶檢索數據的一致性, 通過UNDO記錄,當用戶檢索數據庫數據時,Oracle總是使用戶只能看到被提交過的數據或特定時間點的數據(select語句時間點),UNDO記錄會被存放到回滾段中,假如該數據未提交,用戶檢索數據時,都是從UNDO記錄中取得的.(如下圖:)

從UNDO記錄中取得 

1. Oracle檢索數據一致性

先打開一個SecureCRT.(第一個session)

先建一個表

  1. SQL> create table c(a int);  
  2. Table created.  
  3. SQL> alter table c add b number;  
  4. Table altered.  
  5. SQL> desc c   
  6.  Name                                      Null?    Type  
  7.  ----------------------------------------- -------- --------------------------------------------  
  8.  A                                                  NUMBER(38)  
  9.  B                                                  NUMBER  

表中插入數據並提交

  1. SQL> insert into c values(1,2);  
  2. 1 row created.  
  3. SQL> insert into c values(3,4);  
  4. 1 row created.  
  5. SQL> select * from c;  
  6.          A          B  
  7. ---------- -----------------------------  
  8.          1          2  
  9.          3          4  
  10. SQL> commit;  
  11. Commit complete.  

再打開一個SecureCRT.(第二個session)

查詢

  1. SQL> select * from c;  
  2.          A          B  
  3. ---------- --------------------------  
  4.          1          2  
  5.          3          4  

第一個session更改表中的數據但不提交

  1. SQL> update c set b=10 where a=1;  
  2. 1 row updated.  

第二個session查詢(修改但沒有提交檢索的是UNDO中的數據)

  1. SQL> select * from c;  
  2.          A          B  
  3. ---------- --------------------------  
  4.          1          2  
  5.          3          4  

第一個session提交

  1. SQL> commit;  
  2. Commit complete.  

第二個會話查詢(可見只有提交後才能檢索到數據段的數據)

  1. SQL> select * from c;  
  2.          A          B  
  3. ---------- -------------------------  
  4.          1         10  
  5.          3          4  

結論:如果用戶修改數據但沒有提交,其它用戶檢索的都是UNDO段的數據,這樣就保證了數據的一致性

2.回滾數據(事務恢復)

1.當用戶updata數據但還沒有提交

  1. SQL> select * from c;  
  2.          A          B  
  3. ---------- -----------------------------  
  4.          1          10  
  5.          3          4  
  6. SQL> update c set b=2 where a=1;  
  7. SQL> select * from c;  
  8.          A          B  
  9. ---------- -----------------------------  
  10.          1          2  
  11.          3          4  

這時用戶突然後悔了,想恢復到原來的狀態

  1. SQL> rollback;  
  2. Rollback complete.  
  3. SQL> commit;  
  4.    
  5. SQL> select * from c;  
  6.          A          B  
  7. ---------- -----------------------  
  8.          1         10  
  9.          3          4  

可見當用戶用命今rollback還能回滾到初始狀態.

2.當用戶updata數據且已提交

當用戶updata數據且已提交後,可以根據SCN記錄把數據還源.

先查看原始數據

  1. SQL> select * from c;  
  2.          A          B  
  3. ---------- ----------  
  4.          1         10  
  5.          3          4  

找到SCN

  1. SQL> select current_scn from v$database;  
  2. CURRENT_SCN  
  3. -----------  
  4.      693636  

現在刪除表中的數據並提交

  1. SQL> delete from c;  
  2. rows deleted.  
  3. SQL> commit;         
  4. Commit complete.  

查詢(現在表中已沒有數據了)

  1. SQL> select * from c;  
  2. no rows selected  

檢索特定SCN的數據

  1. SQL> select * from c as of scn 693636;  
  2.          A          B  
  3. ---------- ----------  
  4.          1         10  
  5.          3          4  

恢復數據

  1. SQL> insert into c select * from c as of scn 693636;  
  2. rows created.  
  3. SQL> commit;  
  4. Commit complete.  

現在再查詢

  1. SQL> select * from c;  
  2.          A          B  
  3. ---------- ----------------------  
  4.          1         10  
  5.          3          4  

可見可以根據SCN恢復到某一檢查點的數據,如果把SCN轉換成時間,,就可以把數據恢復到某一時間點.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved