1. 程式人生 > >如果一個事務還沒提交,那麽它中間產生的數據變化會不會在未提交之前寫入磁盤

如果一個事務還沒提交,那麽它中間產生的數據變化會不會在未提交之前寫入磁盤

.html sys 控制 鏈接 發現 更新 觸發 taf commit

1、如果一個事務還沒提交,那麽它中間產生的數據變化會不會在未提交之前寫入磁盤呢?
回答:
會,寫入不寫入磁盤和提交沒提交沒有關系
commit 不一定會寫磁盤哦,要等到dwr進程的時候才會寫入磁盤吧,但commit一定會寫人redo
一個事務 commit 並不是把數據寫到數據文件中,而是寫到聯機 重做日誌文件中

2、Oracle 中存在這樣的情況嗎?某事務沒有提交,它的改動已經寫回到數據文件,給解釋一下怎樣出現的這種情況?謝謝!
回答:
其實你這個問題本身就有問題
因為數據提不提交和數據有沒有被寫到數據文件沒有關系。數據提交了,有可能沒有被寫到數據文件!數據沒有提交,有可能寫到數據文件!
這個就沒有什麽好解釋的。好好看看lgwr和DBWn的作用和觸發條件

應該說樓主你說的這種情況,是ORACLE的常態,有幾個條件會觸發寫入數據文件,比如緩存使用達到了閥值(100M),或者達到一定比例,比如進行了CHECKPOINT
比如說你一個大事務未提交,這時候因為BUFFER已經超過100M,臟數據已經寫入到數據文件種,這時候數據庫發生了DOWN機,
在重啟時,數據庫首先要驗證數據文件與控制文件的的SCN號,發現這個表空間有不應該提交的數據,然後就是用回滾段進行回滾。
有時候需要REDO先產生UNDO。然後數據文件達到一致,數據庫OPEN.


3、DBWR 在什麽情況下會寫臟數據到數據文件:
1.當臟緩沖區的數量超過閾值。
2.設定的時間間隔達到。
3.檢查點發生時

4.tablespace 發生 offline 或恢復normal
5.對某個表聯機設備時
6.找不到free buffer時
7. drop 或truncate 表時
8.把表設置為read-only時
這樣看 好像,臟數據隨時都有可能被寫入datafile中,不管是不是提交了。


4、其中checkpoint 發生又有多的情況
(1) 日誌切換 (自動或人為)
(2)Timeout
(3)alter system checkpoint
(4)alter tablespace begin backup or end backup
(5)datafile offline


如果 checkpoint 發生的 所有臟數據都flush 到 datafile中?此checkpoint 之前的所有redo file 對恢復不再有用。

checkpoint
DBWR
LGWR

三者有自己的運行機制,又有聯系。在看看之間的關系
更新後沒有提交(COMMIT)的數據一般存放在了內存SGA數據緩沖區的臟列表中。有些更新過的數據由後臺寫數據進程DBWn被寫入數據文件中,但加上未提交標誌。等事務被COMMIT時,把未提交標誌改為已提交標誌。數據庫恢復操作中回滾就是因為沒有提交數據被寫入數據文件引起的。

參考鏈接

http://www.itpub.net/thread-1505747-1-1.html

如果一個事務還沒提交,那麽它中間產生的數據變化會不會在未提交之前寫入磁盤