oracle保證讀一致性與回滾段

2022-02-20 11:02:51 字數 1394 閱讀 4529

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

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

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

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

圖中 黑色的標記 代表 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保證讀一致性與回滾段

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

oracle保證讀一致性原理

這裡也有講解 1 undo segment的概念 當資料庫進行修改的時候,需要把儲存到以前的old的資料儲存到乙個地方,然後進行修改,用於儲存old資料的segment 就是undo segment。以前老的東西是可以被覆蓋掉的,因為undo segment是一種迴圈利用的方式。看下圖 如上圖所示 ...

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

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