MySQL中是如何實現事務提交和回滾的?

2021-10-08 07:20:51 字數 1788 閱讀 7678

什麼是事務

事務是由資料庫中一系列的訪問和更新組成的邏輯執行單元

事務的邏輯單元中可以是一條sql語句,也可以是一段sql邏輯,這段邏輯要麼全部執行成功,要麼全部執行失敗

舉個最常見的例子,你早上出去買早餐,支付寶掃碼付款給早餐老闆,這就是乙個簡單的轉賬過程,會包含兩步

這兩步其中任何一部出現問題,都會導致整個賬務出現問題

假如你的支付寶賬戶扣款10元成功,早餐老闆的賬戶增加失敗,那你就悲劇了,早餐老闆不會放過你,會讓你重新付款,相當於你請馬雲吃早餐了-_-?

事務就是用來保證一系列操作的原子性,上述兩步操作,要麼全部執行成功,要麼全部執行失敗

資料庫為了保證事務的原子性和永續性,引入了redo log和undo log

redo log

redo log是重做日誌,通常是物理日誌,記錄的是物理資料頁的修改,它用來恢復提交後的物理資料頁

如上圖所示,redo log分為兩部分:

sql運算元據庫之前,會先記錄重做日誌,為了保證效率會先寫到日誌緩衝區中(redo log buffer),再通過緩衝區寫到磁碟檔案中進行持久化,既然有緩衝區說明資料不是實時寫到redo log file中的,那麼假如redo log寫到緩衝區後,此時伺服器斷電了,那redo log豈不是會丟失?

在mysql中可以自已控制log buffer重新整理到log file中的頻率,通過innodb_flush_log_at_trx_commit引數可以設定事務提交時log buffer如何儲存到log file中,innodb_flush_log_at_trx_commit引數有3個值(0、1、2),表示三種不同的方式

undo log

undo log是回滾日誌,用來回滾行記錄到某個版本,undo log一般是邏輯日誌,根據行的資料變化進行記錄

undo log跟redo log一樣也是在sql運算元據之前記錄的,也就是sql操作先記錄日誌,再進行運算元據

如上圖所示,sql操作之前會先記錄redo log、undo log到日誌緩衝區,日誌緩衝區的資料會記錄到os buffer中,再通過呼叫fsync()方法將日誌記錄到log file中

undo log記錄的是邏輯日誌,可以簡單的理解為:當insert一條記錄時,undo log會記錄一條對應的delete語句;當update一條語句時,undo log記錄的是一條與之操作相反的語句

當事務需要回滾時,可以從undo log中找到相應的內容進行回滾操作,回滾後資料恢復到操作之前的狀態

undo日誌還有乙個用途就是用來控制資料的多版本(mvcc),在《innodb儲存引擎中的鎖》一文中講到mvcc是通過讀取undo日誌中資料的快照來進行多版本控制的

undo log是採用段(segment)的方式來記錄的,每個undo操作在記錄的時候占用乙個undo log segment。

另外,undo log也會產生redo log,因為undo log也要實現永續性保護

mysql中是如何實現事務提交和回滾的?

簡單理解就是:

redo log是用來恢復資料的,用於保障已提交事務的永續性

undo log是用來回滾事務的,用於保障未提交事務的原子性

mysql事務級別以及是如何實現的(鎖)

隔離級別 acid 讀未提交 讀已提交 不可重複讀 序列事務隔離級別 隔離級別 髒讀不可重複讀 幻讀備註 讀未提交 read uncommitted nn n讀已提交 read committed yn noracle 預設級別 可重複讀 repeatable read yy nmysql 預設級別...

4 什麼是事務?MySQL如何支援事務?

什麼是事務?事務是由一步或幾步資料庫操作序列組成邏輯執行單元,這系列操作要麼全部執行,要麼全部放棄執行。程式和事務是兩個不同的概念。一般而言 一段程式中可能包含多個事務。說白了就是幾步的資料庫操作而構成的邏輯執行單元 事務具有四個特性 原子性 atomicity 一致性 consistency 隔離...

Mysql是怎麼實現事務的

mysql的innodb儲存引擎是通過事務來保證資料的一致性的 資料庫事務通常包含了乙個序列的對資料庫的讀 寫操作包含有以下兩個目的 為資料庫操作序列提供了乙個從失敗中恢復到正常狀態的方法,同時提供了資料庫即使再異常狀態下仍能保持一致性的方法 當多個應用程式再併發訪問資料庫時,可以再這些應用程式之間...