Oracle ACID 實現機制

REDO UNDO日誌模擬

在這裏插入圖片描述

事務原子性:

原子性指的就是事務裏面的所有操作要麼全部成功,要麼全部失敗。所以我們如果執行到一半的情況下發現了其中的操作進行失敗了,這個時候我們應該把前面執行成功的一半記錄進行還原。
這個有點難啊?覆水怎麼還可以收回呢?現在抖音上面就可以做到,是怎麼的做到的呢?那就是時間迴流?
只要我們記錄下面開始操作的狀態,就可以進行回滾,這個就是上面裏面的undo日誌,在事務回滾了,我們只需要把我們進行的改變一一回滾即可。那麼如果在你進行操作的時候,另外一個事務已經進行commit這一行了,不會的,數據庫在更新的時候,會添加排他鎖的。

數據的一致性如何實現?

數據的一致性指的就是用戶在看到這個記錄的應該是已經提交過的記錄,而不是中間狀態的記錄。
在oracle中,根據SCN(System Change Numer)來判斷這個數據是否進行了改變,如果一個活動事務把這個數據進行了改變,那麼對應的SCN數字就會向上增。並且如果事務還沒有提交,這個事務就會被放在活動事務裏面,每次讀取的話,就會讀取一個最大的已提交事務版本的值,所以可以實現READ_COMMITED,並且ORACLE默認的就是READ_COMMITED。

事務隔離性怎麼實現?

事務隔離性包括 READ_UNCOMMITED、READ_COMMITED、REPETA_READ、SERIALIZED。
那麼在Oracle裏面默認的隔離級別的是READ_COMMITED。

持久化如何實現?

它是由刷盤下DBWR(DB Writer)在CKPT(checkpoint)的觸發下進行的,但是這個並不能保證所有的數據都被持久化,其實更多還是由REDO/UNDO日誌保證的,每次COMMIT都會觸發LGWR(LogWriter)寫日誌,並且這個是直接寫入到磁盤裏面的。這樣數據庫在宕機重啓的時候就會根據重做日誌進行數據的恢復,並且根據UNDO日誌將未COMMIT的事務進行回滾。
UPDATE 場景:
假如事務裏面有三個更新操作,如果執行了兩個操作系統就宕機了?那麼重啓起來是怎麼做的呢?
首先根據前面的兩個操作的redo日誌,然後系統會構造出來對應的undo日誌和數據塊,然後再根據undo進行回滾,爲什麼不直接回滾呢?因爲現在數據庫裏面對應的數據塊還沒有存在

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章