有關延遲塊兒清除、快照過舊、讀一致的總結,希望把這三個知識點串聯一起做個總結,沒有鉅細無遺的寫完每個地方,歡迎大家一起討論,如果有前輩指出錯誤的地方更是不勝感激。
blockcleanout 並不是指把髒塊兒寫入磁碟,只是單純的指把db buffer中乙個塊從 dirty 變為 clean,表明這個塊裡面的資料是乾淨的、最新的,本質上是更新 block header 中的乙個標誌位——itl(interested transaction list)和block scn。
什麼是delayed block cleanout?
每當事務commit 時,事務修改過的塊兒就會被 cleanout,不過clean out有2種方式:fast commit cleanout和delayed blockcleanout。
1.fastcommit cleanout 算是真正意義上的 cleanout,當做fast commit cleanout時,oracle將事務commit 時的系統scn作為commitscn,馬上更新block上 itl 、block scn 和 undo segment header的transaction table的slot(槽)上的 scn,三者是一致的。
2.delayedblock cleanout 是將 cleanout 操作延後了,由於某些原因只是用commit scn更新了undo segment header 的 transaction table 上的slot scn,而並未做block上的更新,等待下次使用此block的時候,再用undo segment header 的 transaction table 上的slot scn(與之前事務的commit scn相同)去更新 block scn 和 itl。(當下一次操作如select,update,insert或delete訪問到這些塊時需要在讀入後完成塊清除)
為什麼要執行delayed block cleanout呢?
這是出於效能考慮的,我們首先來看哪些塊會做delayed block cleanout
前提:oracle有乙個modifiedblock list 結構(checkpoint queue機制?),用來記錄每個transaction更改過的block,每個transaction可以在這個list上面記錄大約10%buffercache這多的modified block。
事務commit 時:
更改過的block低於10%,則oracle可以根據modified block list定位到那些塊並做fast commit cleanout。
更改過的block超過10%,則超出部分就做delayed block cleanout。
未commit前,由於事務耗時太長已經被寫至磁碟的塊做delayed block cleanout。
這裡就可以看出,不立即cleanout 的原因有二,但本質都是不能立刻在db buffer中找到對應的塊兒,前者是超出10%,沒有在list中記錄,後者是已經寫入磁碟,如果再重新讀回db buffer再修改,io太多,都影響效能。
和快照過舊是什麼關係?
前提:別的會話用過這個塊兒(clean),或者正在占用這個塊兒(dirty),都會在塊兒上記錄itl(itl、xid、flag、uda、scn\fsc)。
1.當發出一條select語句時,oracle會記錄下這個時刻scn,然後在buffer cache中查詢需要的block,或者從磁碟上讀。
2.首先要檢視最近乙個修改這個塊的事務的flag,如果需要cleanout 就馬上執行。如果執行成功或者不需要執行就接著比較itlscn和select scn,如果itl scn > select scn,證明塊兒的版本是比要select的新,要執行讀一致找舊版本。
3.oracle就會根據itl中的uba找到undo資訊獲得該block的前映象,然後在buffercache 中構造出cr塊,此時oralce也會檢查構造出來的cr塊兒中itl記錄的scn,如果scn還大於select時刻的scn,那麼一直重複構造前映象,直到找到需要的塊兒,這樣oracle就實現了多版本。但如果在構造前映象的過程中所需的undo資訊被覆蓋了,就會報快照過舊的錯誤。所以簡單來說,是利用遞推方式去找到和自己select同一scn的那個塊兒的版本,如果找不到就是快照過舊。
而對於延遲清除的塊兒,儘管對應的事務已經commit,但自己本身還是dirty狀態。之前commit的時候只是更新undo segment header的transaction table的slot(槽)上的 scn,而塊兒自己的itl 和 block scn卻沒有更新。當再次訪問到這個塊兒的時候,肯定要完成剩餘的工作,即上面第二步說的馬上cleanout——更新這個塊兒的itl scn 和 blockscn。之前說過,如果clean執行成功就接著比較itl scn和selectscn來決定是否需要要執行讀一致。但如果因為undo被覆蓋,就獲得不了commit scn,連cleanout也不能執行,也就比較不了大小了。報錯還是快照過舊。
有關選單進行「估清」的功能
這裡的估清,我用在了選單上,也就是這個菜品當天能不能點餐,這就是估清的功能。進行估清的選單,我是寫在了資料庫中,讓資料庫這張選單表進行遍歷出想要顯示的內容 一 資料庫的結構 在資料庫中建立一張選單表,字段內容有點關聯,比如這個類別中的菜品 下面的表就是我建立的表 二 表建立結束後,就是想想這個功能了...
奇葩問題與主線程延遲有關
dispatch after dispatch time dispatch time now,int64 t 0.3f nsec per sec dispatch get main queue dispatch after dispatch time dispatch time now,int64 ...
有關hibernate相關的延遲載入和快取機制
1 延遲載入 當真正需要資料時才從資料庫中載入,目的就是為了提高執行效率 注意 當載入延遲載入的資料時,如果session關閉,那麼就會出現no session的異常,從而導致延遲載入的資料 無法載入 2 延遲載入分類 1 實體級別的延遲載入 只對load方法有效 2 集合關聯屬性的延遲載入 集合屬...