問題:資料庫插入百萬級資料的時候,還沒操作完,但是把伺服器重啟了,資料庫會繼續執行嗎? 還是直接回滾了?
答案:不會自動繼續執行,不會自動直接回滾,但是可以人工手動選擇繼續執行或者直接回滾,依據是事務日誌。
事務開啟時,事務中的操作,都會先寫入儲存引擎的日誌緩衝中,在事務提交之前,這些緩衝的日誌都需要提前重新整理到磁碟上持久化,這就是人們口中常說的「日誌先行」(write-ahead logging)。
日誌分為兩種型別:redo log和undo log
(1)redo log
在系統啟動的時候,就已經為redo log分配了一塊連續的儲存空間,以順序追加的方式記錄redo log,通過順序io來改善效能。所有的事務共享redo log的儲存空間,它們的redo log按語句的執行順序,依次交替的記錄在一起。如下乙個簡單示例:
記錄1:
記錄2:
記錄3:
記錄4:
記錄5:
此時如果資料庫崩潰或者宕機,那麼當系統重啟進行恢復時,就可以根據redo log中記錄的日誌,把資料庫恢復到崩潰前的乙個狀態。未完成的事務,可以繼續提交,也可以選擇回滾,這基於恢復的策略而定。
(2)undo log
undo log主要為事務的回滾服務。在事務執行的過程中,除了記錄redo log,還會記錄一定量的undo log。undo log記錄了資料在每個操作前的狀態,如果事務執行過程中需要回滾,就可以根據undo log進行回滾操作。單個事務的回滾,只會回滾當前事務做的操作,並不會影響到其他的事務做的操作。
以下是undo+redo事務的簡化過程,假設有2個數值,分別為a和b,值為1,2
start transaction;
記錄 a=1 到undo log;
update a = 3;
記錄 a=3 到redo log;
記錄 b=2 到undo log;
update b = 4;
記錄b = 4 到redo log;
將redo log重新整理到磁碟
commit
在1-8的任意一步系統宕機,事務未提交,該事務就不會對磁碟上的資料做任何影響。如果在8-9之間宕機,恢復之後可以選擇回滾,也可以選擇繼續完成事務提交,因為此時redo log已經持久化。若在9之後系統宕機,記憶體對映中變更的資料還來不及刷回磁碟,那麼系統恢復之後,可以根據redo log把資料刷回磁碟。所以,redo log其實保障的是事務的永續性和一致性,而undo log則保障了事務的原子性。
Mysql如果在執行事務過程中宕機了怎麼辦?
參考 在innodb的儲存引擎中,事務日誌通過重做 redo 日誌和innodb儲存引擎的日誌緩衝 innodb log buffer 實現。事務開啟時,事務中的操作,都會先寫入儲存引擎的日誌緩衝中,在事務提交之前,這些緩衝的日誌都需要提前重新整理到磁碟上持久化,這就是dba們口中常說的 日誌先行 ...
Mysql 事務與儲存過程中事務的管理
目標 1.了解事物的概念,會開啟 提交和回滾事務 2.掌握事物的4種隔離級別 3.學會建立儲存過程 4.學會呼叫 檢視 修改和刪除儲存過程 事務管理 1.什麼是事務 一條或多條sql語句 所謂的事物就是針對資料庫的一組操作,可以是一條或者多條sql語句組成,同乙個事務具有同步的特點,如果其中一條無法...
儲存過程中事務操作
資料庫中事務主要應用在多條語句的更新操作 插入 修改 刪除 可以保證資料的完整性與正確性。使用原則為盡可能少的影響資料,以免產生死鎖或者占用資源。在儲存過程中如果中間操作有非嚴重的錯誤資訊執行不會中斷,會繼續執行並返回相應結果。但是程式呼叫的話如果不是用 try catch形式則會報錯,出現黃頁。需...