commit是送出事務,那麼commit到底做了什麼?
其實commit做的并不多,它出發LGWR程序,将重做的記錄寫入聯機日志,并且将修改的資料的資料庫頭部标記為已送出。送出後,undo快可以被其他 事務調用覆寫,隻有到達一定條件後出發ckpt程序才會把SGA中的資料寫入資料檔案。其他的一些操作在commit之前已經操作完成,是以,即使很大的 資料量修改在commit的時候也不會消耗很多的時間。
在commit之前,加入執行一個update操作,首先會在share pool裡解析生成執行計劃,然後根據執行計劃找到相關資料檔案的資料塊,調入buffcache,并在裡面找到一個可以用的undo資料塊,如果沒有則從undo表空間裡找并且調入buff cache。把修改之前的值放在undo資料塊,修改後的值放在相關資料的資料塊。在資料塊發生過程中記錄兩次重做記錄,并且記錄重做記錄号。在沒有 commit或者rollback之前不會釋放DML鎖。
需要注意的是,由于在commit之前資料庫做了很多操作,是以rollback會很消耗資源(對于相當大量的DML操作)