MySQL事務機制

2021-09-12 06:46:13 字數 1539 閱讀 6003

事務會把資料庫從一種一致狀態轉換為另一種狀態。在資料庫提交工作時,可以確保要麼所有修改都已經儲存了,要麼所有修改都不儲存。事務具有acid這四個特性,分別為原子性(atomicity)、一致性(consistency)、隔離性(isolation)、永續性(durability)。

事務是由一條非常簡單的sql語句組成,也可以由一組複雜的sql語句組成。事務是訪問並更新資料庫中各種資料項的乙個程式執行單元。在事務中的操作,要麼都做修改,要麼都不做,這就是事務的目的。

原子性:同乙個事務是不可分割的單元,要麼全部完成,要麼全部失敗。

一致性:資料庫從乙個狀態轉變成下一種一致的狀態,在事務開始之前和事務結束之後,資料庫的完整性約束沒有被破壞。例如a向b轉了100,那麼a的賬戶少了100,這時,b的賬戶必須多了100,不然就是不一致的。另外乙個例子就是能量守恆定律。

永續性:事務一旦提交,其結果就是永久性的。即使發生宕機等故障,資料庫也能恢復資料。

redo恢復提交事務修改的頁操作,而undo回滾行記錄到某個特定版本。因此兩者記錄的內容不同,redo通常是物理日誌,記錄的是頁的物理修改操作。undo是邏輯日誌,根據每行記錄進行記錄。

redo log用來實現事務的永續性和一致性,它由兩部分組成:一是記憶體中的重做日誌緩衝(redo log buffer),其是易失的;二是重做日誌檔案(redo log file),其是持久的。事務開啟時,事務中的操作,都會先寫入儲存引擎的日誌緩衝中,在事務提交之前,這些緩衝的日誌都需要提前重新整理到磁碟上持久化,這就是dba們口中常說的「日誌先行」(write-ahead logging)。當事務提交之後,在buffer pool中對映的資料檔案才會慢慢重新整理到磁碟。此時如果資料庫崩潰或者宕機,那麼當系統重啟進行恢復時,就可以根據redo log中記錄的日誌,把資料庫恢復到崩潰前的乙個狀態。未完成的事務,可以繼續提交,也可以選擇回滾,這基於恢復的策略而定。

undo主要用於回滾和實現mcvv,它是在使用者執行事務時,由於某種原因失敗,又或者有乙個rollback語句請求回滾,就可以利用這些undo資訊將資料回滾到修改前的樣子。undo存放在資料庫內部的乙個特殊欄位中,這個段叫做undo段,位於共享表空間中。注意undo是邏輯日誌,因此只是將資料庫邏輯地恢復到原來的樣子。所有的修改都被邏輯地取消了,但是資料結構和頁本身在回滾之後可能大不相同。

前面還說到mcvv是通過undo來完成的。當使用者讀取一行記錄時,若該記錄已經被其他事務占用,當前事務可以通過undo讀取之前的行版本資訊,以實現非鎖定讀取。

最後,undo log會產生redo log,也就是undo log的產生會伴隨著redo log的產生,這是因為undo log也需要永續性的保護。

innodb的mvcc是通過在每行記錄後面儲存兩個隱藏的列來實現。這兩個列乙個儲存了行的建立時間,乙個儲存行的過期時間(刪除時間)。當然儲存的並不是真實的時間而是系統版本號(system version number)。每開始乙個新的事務,系統版本號都會自動新增。事務開始時刻的系統版本號會作為事務的版本號,用來查詢到每行記錄的版本號進行比較。

《mysql技術內幕》

mysql事務機制 Mysql事務機制

mysql事務是指將資料庫從一種一致性狀態轉到另一種一致性狀態 mysql事務具有acid特性 原子性 atomicity 事務中的所有操作,要麼全部執行,要麼都不執行 一致性 consistency 事務開始和結束後,資料庫的完整性不會被破壞 隔離性 isolation 事務之間互不影響。事務的隔...

mysql事務機制

1 為什麼需要事務機制 避免寫入直接運算元據檔案,寫入直接運算元據檔案是一件非常危險的事情,遇到突發事故,沒有資料檔案對比無法還原。mysql五種日誌檔案,其中只有undo和redo日誌與事務有關。拷貝資料記錄在 redo日誌裡面,記錄修改記錄在undo日誌裡面。2 事務機制 事務是一組sql語句當...

MySQL事務機制

事務的acid屬性 原子性,一致性,隔離性,永續性 事務的原子性 乙個事務中所有的操作要麼全部完成,要麼全部失敗。事務執行後,不允許停留在中間某個狀態 事務的一致性 不管在任何給定的時間 併發事務有多少,事務必須保證執行結果的一致性。事務的隔離性 隔離性要求事務不受其他併發事務的影響,如同在給定的時...