一個 db block gets是一個current mode get.這是現在或者最近的數據塊中最新的copy。
在buffer cache中任何時候只能有一個block的copy。 Db block gets是發生通常是:DML改變database中的數據的時候。在這種情況下row-level的鎖會隱式的加載在正在被更新的rows上。
當select語句執行一個db block gets的時候,最少有一個well-knowncase,,而且不會產生lock。
當執行一次全表掃描或者全索引掃描的時候,oracle會讀取segment的header以 current mode(多次讀取,取決於oracle版本)。
Current mode:
Oracle獲得block用兩種方式:current或者consistent
Consistent get是當oracle得到一個block(一致性的block,有一個給予的時間點或者SCN)
一致性得到是oracle一致性讀機制的核心。爲了完成查詢結果,block會被拿出來,它們被取出來在一致性模式上。如果在buffer cache中的block和正確的point不一致的話,oracle會使用rollback sgement中的信息重建block。如果失敗的話,這就是會產生錯誤。
(爲什麼buffer cache中的block和正確的point不一致?)
Current mode 是相對於query mode來說的,current mode產生db block gets,一般是在DML的時候產生
Query mode 產生 consistent gets,一般在查詢的時候產生,,總和一般稱爲邏輯讀,logicalread。
Current mode是當前讀到的是什麼數據就是什麼數據,
一致性模式是:從開始到結束讀到的數據都是同一個時間點內
Select is query mode
And DML like insertupdate delete is consistent mode
Oracle 讀一致性
Consistent read:如何實現:
Oracle邏輯讀:是從內存,確切的說是從:SGA中的buffer cache中取出東西來
Logical read,又分爲:db block gets ,consistentgets
Db block gets 是DML執行的時候,在內存中讀取的東西,還涉及到oracle的undo segment
而consistent gets是,select執行的時候,因爲不會產生數據變化,所以說是直接從oracle的buffer cache 中取出東西來就OK了
What the fuck is going on?
What the hell is going on?
Where is the truth?