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

教你應對Oracle檢索數據的一致性以及回滾數據

編輯:Oracle數據庫基礎

 Oracle為了保證用戶檢索數據的一致性, 通過UNDO記錄,當用戶檢索數據庫數據時,Oracle總是使用戶只能看到被提交過的數據或特定時間點的數據(select語句時間點),UNDO記錄會被存放到回滾段中,假如該數據未提交,用戶檢索數據時,都是從UNDO記錄中取得的。
  1. Oracle檢索數據一致性
  先打開一個SecureCRT.(第一個session)
  先建一個表
  SQL> create table c(a int);
  Table created.
  SQL> alter table c add b number;
  Table altered.
  SQL> desc c
  Name Null? Type
  ----------------------------------------- -------- --------------------------------------------
  A NUMBER(38)
  B NUMBER
  表中插入數據並提交
  SQL> insert into c values(1,2);
  1 row created.
  SQL> insert into c values(3,4);
  1 row created.
  SQL> select * from c;
  A B
  ---------- -----------------------------
  1 2
  3 4
  SQL> commit;
  Commit complete.
  再打開一個SecureCRT.(第二個session)
  查詢
  SQL> select * from c;
  A B
  ---------- --------------------------
  1 2
  3 4
  第一個session更改表中的數據但不提交
  SQL> update c set b=10 where a=1;
  1 row updated.
  第二個session查詢(修改但沒有提交檢索的是UNDO中的數據)
  SQL> select * from c;
  A B
  ---------- --------------------------
  1 2
  3 4
  第一個session提交
  SQL> commit;
  Commit complete.
  第二個會話查詢(可見只有提交後才能檢索到數據段的數據)
  SQL> select * from c;
  A B
  ---------- -------------------------
  110
  3 4
  結論:如果用戶修改數據但沒有提交,其它用戶檢索的都是UNDO段的數據,這樣就保證了數據的一致性

2.回滾數據(事務恢復)
  1.當用戶updata數據但還沒有提交
  SQL> select * from c;
  A B
  ---------- -----------------------------
  1 10
  3 4
  SQL> update c set b=2 where a=1;
  SQL> select * from c;
  A B
  ---------- -----------------------------
  1 2
  3 4
  這時用戶突然後悔了,想恢復到原來的狀態
  SQL> rollback;
  Rollback complete.
  SQL> commit;
  SQL> select * from c;
  A B
  ---------- -----------------------
  110
  3 4
  可見當用戶用命今rollback還能回滾到初始狀態。
  2.當用戶updata數據且已提交
  當用戶updata數據且已提交後,可以根據SCN記錄把數據還源。
  先查看原始數據
  SQL> select * from c;
  A B
  ---------- ----------
  110
  3 4
  找到SCN
  SQL> select current_scn from v$database;
  CURRENT_SCN
  -----------
  693636
  現在刪除表中的數據並提交
  SQL> delete from c;
  2 rows deleted.
  SQL> commit;
  Commit complete.
  查詢(現在表中已沒有數據了)
  SQL> select * from c;
  no rows selected
  檢索特定SCN的數據
  SQL> select * from c as of scn 693636;
  A B
  ---------- ----------
  110
  3 4
  恢復數據
  SQL> insert into c select * from c as of scn 693636;
  2 rows created.
  SQL> commit;
  Commit complete.
  現在再查詢
  SQL> select * from c;
  A B
  ---------- ----------------------
  110
  3 4
  可見可以根據SCN恢復到某一檢查點的數據,如果把SCN轉換成時間,,就可以把數據恢復到某一時間點。

 

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