Commit和dbwr沒有任何關(guān)系、物理讀產(chǎn)生邏輯讀、快照過舊的理解

The COMMIT statement ends the current transaction, making its changes permanent and visible to other users.

commit僅僅是觸發(fā)lgwr把日志緩沖數(shù)據(jù)寫入在線重做日志并且把提交了數(shù)據(jù)的事務(wù)的scn將記錄在控制文件中,注意此時的數(shù)據(jù)文件中的scn沒有變化,COMMIT不會觸發(fā)任何的checkpoint

The DBWn process writes dirty buffers to disk under the following conditions:
--When a server process cannot find a clean reusable buffer after scanning a threshold number of buffers, it signals DBWn to write. DBWn writes dirty buffers to disk asynchronously if possible while performing other processing.
--DBWn periodically writes buffers to advance the checkpoint
在以下條件下,DBWn進(jìn)程將臟緩沖區(qū)寫入磁盤:
--當(dāng)服務(wù)器進(jìn)程在掃描閾值數(shù)量的緩沖區(qū)之后找不到干凈的可重用緩沖區(qū)時,它會將DBWn發(fā)信號寫入。 執(zhí)行其他處理時,如果可能,DBWn將異步緩沖區(qū)寫入磁盤。
--定期寫入緩沖區(qū)以推進(jìn)檢查點(diǎn)

所以Commit和Dbwr沒有任何關(guān)系
一些數(shù)據(jù)塊,產(chǎn)生它們的事務(wù)還未提交,但是它們已經(jīng)被DBWn寫回到數(shù)據(jù)文件中了,當(dāng)然也提前寫入redo中了(dbwr寫前協(xié)議,即某個數(shù)據(jù)還沒有寫入redo就要發(fā)生dbwr則必須等待lgwr將數(shù)據(jù)寫入redo,寫redo不止包含commit一種條件。)DBWn清理臟數(shù)據(jù)塊從來就同事務(wù)commit與否沒有任何關(guān)系。只要內(nèi)存沒有有空閑,就會把這些臟塊給flush到數(shù)據(jù)文件內(nèi)。這些未提交的事務(wù)但被寫入數(shù)據(jù)文件的數(shù)據(jù),即便是已經(jīng)在你的數(shù)據(jù)文件了。事務(wù)恢復(fù)階段將按需把這些數(shù)據(jù)回滾掉,事務(wù)恢復(fù)后已經(jīng)是垃圾數(shù)據(jù)了(當(dāng)事務(wù)修改數(shù)據(jù)時,會先在回滾段中保存一份修改前數(shù)據(jù)和事務(wù)開始的SCN,如果事務(wù)沒有commit,則標(biāo)記段頭部為ITL,如果commit,則把commit時刻的SCN寫入數(shù)據(jù)塊中,回滾的時候根據(jù)段是否commit來定位,如果沒有commit就直接找到undo中這個會話最初的scn和前鏡像直接回滾,不會一個個數(shù)據(jù)塊去undo,否則10G都已經(jīng)寫入數(shù)據(jù)文件那回滾得多久啊)

堅守“ 做人真誠 · 做事靠譜 · 口碑至上 · 高效敬業(yè) ”的價值觀,專業(yè)網(wǎng)站建設(shè)服務(wù)10余年為成都成都會所設(shè)計小微創(chuàng)業(yè)公司專業(yè)提供成都企業(yè)網(wǎng)站建設(shè)營銷網(wǎng)站建設(shè)商城網(wǎng)站建設(shè)手機(jī)網(wǎng)站建設(shè)小程序網(wǎng)站建設(shè)網(wǎng)站改版,從內(nèi)容策劃、視覺設(shè)計、底層架構(gòu)、網(wǎng)頁布局、功能開發(fā)迭代于一體的高端網(wǎng)站建設(shè)服務(wù)。

實驗過,10G容量級別的大量insert操作了30分鐘,但是不commit,會發(fā)現(xiàn)redo log不停的切換產(chǎn)生歸檔日志,且datafile不停增加。再直接shutdown abort,startup的時候發(fā)現(xiàn)很快,不需要30分鐘。前滾回滾過程應(yīng)該是這樣的:數(shù)據(jù)庫記錄了最新的SCN、增量checkpoint的SCN、redo log的最大SCN,通過增量checkpoint的SCN開始應(yīng)用redo log直到redo log的最大SCN乃至最新的SCN,這樣就完成了前滾,在回滾的時候直接讀取undo中這個會話最初的scn和前鏡像直接回滾,不會一個個數(shù)據(jù)塊去undo,否則10G都已經(jīng)寫入數(shù)據(jù)文件那回滾得多久啊





讀取一個數(shù)據(jù)塊,則這個數(shù)據(jù)塊要么直接來自datafile,要么來自Buffer Cache,如果來自datafile,則也要讀取到SGA中的Buffer Cache中,也就是一次物理讀必然產(chǎn)生一個邏輯讀的意思,數(shù)據(jù)塊上都會有最后一次修改數(shù)據(jù)塊后commit的SCN。
如果一個事務(wù)需要修改數(shù)據(jù)塊中數(shù)據(jù),會先在回滾段中保存一份修改前數(shù)據(jù)和事務(wù)開始的SCN,然后再更新Buffer Cache中的數(shù)據(jù)塊的數(shù)據(jù),如果沒有commit則標(biāo)記段頭部的TIL,如果已經(jīng)commit則把commit后的SCN更新到數(shù)據(jù)塊上。當(dāng)其他進(jìn)程讀取數(shù)據(jù)塊時,會先比較數(shù)據(jù)塊上的SCN和自己的SCN。如果數(shù)據(jù)塊上的SCN 小于等于進(jìn)程本身的SCN,則直接讀取數(shù)據(jù)塊上的數(shù)據(jù);如果數(shù)據(jù)塊上的SCN大于進(jìn)程本身的SCN,則會從回滾段中找出修改前的數(shù)據(jù)塊讀取數(shù)據(jù)。
Oracle的一致性讀的理解:一個語句在讀取數(shù)據(jù)快時,如果發(fā)現(xiàn)這個數(shù)據(jù)塊是在它讀取的過程中被修改的(數(shù)據(jù)塊上的SCN 大于等于讀取進(jìn)程本身的SCN),就不直接從數(shù)據(jù)塊上讀取數(shù)據(jù),而是從相應(yīng)的undo中讀取數(shù)據(jù)。這就保證了最終結(jié)果應(yīng)該是讀操作開始時的那一時刻的快照 (snapshot),而不會受到讀期間其他事務(wù)的影響。當(dāng)然如果放在undo里面的數(shù)據(jù)被覆蓋了,就會報錯ORA-01555:快照過舊


了解Oracle在什么情況下會產(chǎn)生ORA-01555:快照過舊錯誤
假設(shè)有一張6000萬行數(shù)據(jù)的testdb表,預(yù)計testdb全表掃描1次需要2個小時,參考過程如下:
1、在1點(diǎn)鐘,用戶A發(fā)出了select * from testdb;此時不管將來testdb怎么變化,正確的結(jié)果應(yīng)該是用戶A會看到在1點(diǎn)鐘這個時刻的內(nèi)容。
2、在1點(diǎn)30分,用戶B執(zhí)行了update命令,更新了testdb表中的第4100萬行的這條記錄,這時,用戶A的全表掃描還沒有到達(dá)第4100萬條。毫無疑問,這個時候,第4100萬行的這條記錄是被寫入了回滾段,假設(shè)是回滾段UNDOTS1,如果用戶A的全表掃描到達(dá)了第4100萬行,是應(yīng)該會正確的從回滾段UNDOTS1中讀取出1點(diǎn)鐘時刻的內(nèi)容的。
3、這時,用戶B將他剛才做的操作提交了,但是這時,系統(tǒng)仍然可以給用戶A提供正確的數(shù)據(jù),因為那第4100萬行記錄的內(nèi)容仍然還在回滾段UNDOTS1里,系統(tǒng)可以根據(jù)SCN到回滾段里找到正確的數(shù)據(jù),但要注意到,這時記錄在UNDOTS1里的第4100萬行記錄已經(jīng)發(fā)生了重大的改變:就是第4100萬行在回滾段UNDOTS1里的數(shù)據(jù)有可能隨時被覆蓋掉,因為這條記錄已經(jīng)被提交了!
4、由于用戶A的查詢時間漫長,而業(yè)務(wù)在一直不斷的進(jìn)行,UNDOTS1回滾段在被多個不同的transaction使用著,這個回滾段里的extent循環(huán)到了第4100萬行數(shù)據(jù)所在的extent,由于這條記錄已經(jīng)被標(biāo)記提交了,所以這個extent是可以被其他transaction覆蓋掉的!
5、到了1點(diǎn)45分,用戶A的查詢終于到了第4100萬行,而這時已經(jīng)出現(xiàn)了第4條說的情況,需要到回滾段UNDOTS1去找數(shù)據(jù),但是已經(jīng)被覆蓋掉了,這時就出現(xiàn)了ORA-01555錯誤。

新聞標(biāo)題:Commit和dbwr沒有任何關(guān)系、物理讀產(chǎn)生邏輯讀、快照過舊的理解
標(biāo)題網(wǎng)址:http://muchs.cn/article14/pjjsde.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、搜索引擎優(yōu)化、App開發(fā)營銷型網(wǎng)站建設(shè)、網(wǎng)站收錄、App設(shè)計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名