oracle保證讀一致性原理

2021-09-06 10:43:56 字數 1522 閱讀 2821

這裡也有講解

1:undo segment的概念

當資料庫進行修改的時候,需要把儲存到以前的old的資料儲存到乙個地方,然後進行修改,用於儲存old資料的segment 就是undo segment。

以前老的東西是可以被覆蓋掉的,因為undo segment是一種迴圈利用的方式。 看下圖

如上圖所示:

當oracle開啟乙個事務對table表中的資料進行修改,修改的那個資料(行資料)會被拷貝到 右圖 undo  segment(用圓形表示是因為表示會被覆蓋)中,這個時候事務沒有提交,在這個時候查詢table中的資料,進行全部查詢的時候, 當進行全表掃瞄 掃瞄到 被事務修改的資料時候,oracle發現這是一條在事務中沒有提交的資料,就會到 對應的

undo segment中進行查詢以前的資料,這樣 只要修改該錶的事務沒有提交,oracle查詢這個表得到的資料就是以前沒有修改的資料。 這樣就保證了 讀一致性。

下面這個圖是oracle online doc上面的圖: 聯機文件中的解釋為:

解釋上圖:  

scn  (system change  number): 這個號相當於oracle資料庫的乙個自己 的時鐘,用於記錄資料改變的時刻。

rollback  segment和 undo  segment 是同義的。

圖中 黑色的標記 代表  oracle 中使用者有乙個事務正在對這兩個資料(scn為 10024)進行處理, 當事務開啟的時候,oracle會首先把表中的這兩個資料拷貝到 undo segment中, 拷貝的這兩個資料都帶有 各自的 scn號。 如上圖所示,這兩個資料的未被修改前的 scn分別為: 10008 和 10021.

當修改這兩個資料的時候 ,會給這兩個資料賦予新的 scn (就相當於乙個標記什麼時刻修改的這個資料)。這個時候修改這兩個資料(scn為 10008和 10021正在進行),事務正在進行沒有提交。

查詢的執行的sql語句也會有乙個scn(這個scn是這個表最後一次修改提交的scn)

這個時候 ,有乙個查詢需要對這個表進行全表掃瞄(select  *  from  table_name) , 開始執行查詢的時候會有乙個 scn號,然後對這個表進行全表掃瞄,當掃瞄 的時候,oracle會用當前查詢的scn和這個表中每個資料的scn號進行比較,如果這個資料的scn小於<查詢的scn號,證明這個資料當前沒有修改,如果這個資料的

scn >大於 當前查詢的scn號,表示這個資料在當前查詢時刻正在有事務對這個資料進行修改,這個時候查詢會到對應的undo segment中查詢,scn< 當前查詢的scn的資料(也就是事務修改前的資料(這裡指 10008 和 100021 這個兩個資料)),然後一起把這些資料返回, 得到的資料就是事務沒有修改前的資料。

這樣即使有多個事務對這個表進行修改,查詢得到的結果依然是事務沒有提交前的 原來的資料。 這樣就保持了讀一致性。

ORACLE 一致性讀原理記錄

什麼是一致性讀?一致性讀指的是在從查詢那一刻起,中間的變化不予理會。舉例說明 比如我有兩個帳戶a,b.a 有1000塊,b有1000快。我查詢的時候查詢速度比較慢。中間a轉500到b賬戶。已經查詢到a賬戶有1000,b賬戶有1500,這個時候我查詢的結果是查詢的結果應該是2500還是2000呢?正確...

保證一致性嗎 Kafka的一致性保證

魚和熊掌不可兼得。系統設計需要根據具體的應用場景做出權衡。系統設計者可以通過配置kafka,來得到不同程度的需求滿足。每個kafka主題 topic 都分為多個分割槽 partitions 每個分割槽可以具有多個副本 replica 其中乙個副本是主分割槽 leader 所有讀寫請求都由主分割槽提供...

oracle保證讀一致性與回滾段

當資料庫進行修改的時候,需要把儲存到以前的old的資料儲存到乙個地方,然後進行修改,用於儲存old資料的segment 就是undo segment。以前老的東西是可以被覆蓋掉的,因為undo segment是一種迴圈利用的方式。看下圖 當oracle開啟乙個事務對table表中的資料進行修改,修改...