原子性指的就是事務裡面的所有操作要麼全部成功,要麼全部失敗。所以我們如果執行到一半的情況下發現了其中的操作進行失敗了,這個時候我們應該把前面執行成功的一半記錄進行還原。
這個有點難啊?覆水怎麼還可以收回呢?現在抖音上面就可以做到,是怎麼的做到的呢?那就是時間回流?
只要我們記錄下面開始操作的狀態,就可以進行回滾,這個就是上面裡面的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進行回滾,為什麼不直接回滾呢?因為現在資料庫裡面對應的資料塊還沒有存在。
hashmap實現機制
int uint key.gethashcode 0x8ffffff 具體多少忘記了,總之就是把它弄成正數 int index uint map.length 把value放到那個 index位置。下次訪問時再通過 key的hashcode 0x8fffff 再 map.length 就知道valu...
MFC CArchive實現機制
mfc 提供carchive類實現資料的緩衝區讀寫,同時定義了類物件的儲存與讀取方案。以下對carchvie 的內部實現作分析。1.概述 2.內部資料 3.基本資料讀寫 4.緩衝區的更新 5.指定長度資料段落的讀寫 6.字串的讀寫 7.cobject派生物件的讀寫 一.概述 carchive使用了緩...
KVM 實現機制
kvm管理介面 qemu和 kvm關係很深,甚至可以認為雙方本來是乙個軟體,qemu 是應用層的控制部分,而 kvm是核心執行部分。軟體復用能達到如此天衣無縫的地步,是一件很神奇的事情,也說明 kvm設計時候的思路之巧。所以分析kvm 必須首先從 qemu 的 分析入手。為了避免繁瑣,引入太多知識點...