1:事物的隔離性由鎖來實現。事物的永續性和事物的原子性通過redo log來實現。事物的一致性通過undo log來實現。
redo log恢復提交事物修改的頁操作
undo log回滾到行記錄某個特定版本。
redo通常是物理日誌,記錄的是頁的修改操作;undo是邏輯日誌,根據每行記錄進行記錄。
2:redo
redo重做日誌用來實現事物的永續性,即事物acid中的d。由兩部分組成:記憶體中的redo log buffer 和磁碟上的redo log file是持久的。
innodb是事物的儲存引擎,通過force log at commit機制實現事物的永續性。即當事物提交時,必須將該事物的所有日誌寫入到重做日誌檔案進行持久化。待事物的commit操作完成才算完成。
3:undo
undo log用來幫助事物的回滾及mvcc的功能。redo log是順序寫的,在資料庫執行時不需要對redo log的檔案進行讀取操作。而undo log是需要進行隨機讀寫的。
4:fsync
為了確保每次日誌都寫入重做日誌檔案,在每次將重做日誌緩衝寫入重做日誌檔案後,innodb儲存引擎都需要呼叫一次fsync操作。由於重做日誌檔案開啟並沒有使用o_direct選項。因此重做日誌緩衝先寫入檔案系統快取,為了確保重做日誌寫入磁碟,必須進行一次fsync操作。由於fsync的效率取決於磁碟的效能,因此磁碟的效能決定了事物提交的效能,也就是資料庫的效能。
5:innodb_flush_log_at_trx_commit
innodb 引擎允許使用者手工設定非持久的情況發生,以此提高資料庫的效能。即當事物提交時,日誌不寫入重做日誌檔案,而是等乙個時間週期後再執行fsync操作。但是當資料庫宕機時,由於部分日誌沒有重新整理到磁碟,因此會丟失最後一段時間的事物。
innodb_flush_log_at_trx_commit 用來控制事物重新整理磁碟的策略。
該引數的預設值為1
09:35:49>show variables like '%innodb_flush_log_at_trx_commit%';+--------------------------------+-------+
| variable_name | value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1 |
+--------------------------------+-------+
1 row in set (0.00 sec)
該值還可以設定為0或者2。0表示事物提交時不進行寫入重做日誌操作,這個操作在master thread中1秒會進行一次重做日誌檔案的fsync操作;2表示事物提交時將重做日誌寫入重做日誌檔案,但僅寫入檔案系統的緩衝,不進行fsync操作。在這個設定下mysql宕機而作業系統沒有宕機,事物不會丟失。而當作業系統宕機時,重啟資料庫後會丟失未從檔案系統重新整理到重做日誌檔案的部分事物。
MySQL事物系列 1 事物簡介
1 事物是一組sql的集合,要麼都執行,要麼都不執行。有acid4個特性,即 原子性 一致性 隔離性 永續性。a atomicity 原子性 整個事物是不可分割的工作單位。c consistency 一致性 是指事物將資料庫從一種狀態變為另外一種狀態。在事物之前和事物之後,資料庫的完整性約束沒有被破...
MySQL系列 3事物隔離
事務是用來保證資料庫一致性的關鍵技術。事物內的資料庫操作,要麼全部成功,要麼全部失敗。在mysql中,事務支援是在引擎層實現的。本篇文章裡,將會以innodb為例,剖析mysql在事務支援方面的特定實現。隔離性與隔離級別 提到事務,你肯定會想到acid atomicity consistency i...
關於mysql裡面的事物 mysql 事物
mysql之事物詳解 一 事務定義 事務 乙個最小的不可再分的工作單元 通常乙個事務對應乙個完整的業務 例如銀行賬戶轉賬業務,該業務就是乙個最小的工作單元 乙個完整的業務需要批量的dml insert update delete 語句共同聯合完成 事務只和dml語句有關,或者說dml語句才有事務。這...