首先,非常明確的是,innodb實現事務主要通過redo 日誌。
什麼是redo 日誌
redo 日誌 即重做日誌,主要是為了在資料庫奔潰時,保證下次重啟資料庫時,恢復奔潰之前已提交的事務。以保證資料的完整性。
redo 日誌組成
redo日誌緩衝 和 redo日誌
redo 日誌實現原理
在事務提交時,innodb首先保證redo日誌重新整理到磁碟,最後才是提交事務。為了不同的需要,資料庫實現三種不同的刷盤策略
配置變數 innodb_flush_log_at_trx_commit=0/1/2 預設1
1.表示每次呼叫一次fsync
0 表示事務提交時不進行寫入重做日誌,這個操作在master thread中完成
2 表示事務提交時將重做日誌寫入重做日誌檔案,但只是寫入檔案系統的快取中。不進行fsync.由系統自動寫入
redo日誌的特性
1.redo 日誌時物理日誌,記錄的是4元組資料,哪個表空間,哪個檔案,哪個頁,哪個偏移位置,插入的位元組內容
2.redo 日誌是順序寫入的
3.redo log buffer 向 redo log file 寫,是按512個位元組,也就是乙個扇區的大小進行寫入。扇區是寫入的最小單位,一定能寫入成功,因此過程中不需要double write.
事務的特性acid
a: 原子性(atomicity),,事務是不可分割的最小單元,要麼全部成功,要麼全部失敗
c: 一致性(consistency) , 不會因為執行了sql,導致資料庫的完整性和約束性發生改變。比如,本來表是由唯一索引的,不用因為insert/update/delete之後,唯一性索引遭到破壞
i: 隔離性(isolation),事務與事務之間隔離,彼此不可見
d: 永續性(durability),提交的修改,永久儲存到資料庫中,而不是像memcache那樣,一旦重新,資料消失了。
MySQL讀書筆記 事務日誌,MySQL中的事務
事務日誌,可以幫助提高事務的效率。使用事務日誌,儲存引擎在修改表的資料時,只需要修改其記憶體拷貝,再把該修改行為記錄到硬碟上的事務日誌中,而不用每次都將修改的資料本身持久到磁碟。事務日誌採用的是追加的方式,因此寫日誌的操作是磁碟上一小塊區域內的順序i o,而不是隨機i o,所以快很多。事務日誌持久以...
mysql 筆記 事務
一 問題讀取 1.髒讀 dirty read 事務1更新了某一條記錄,但未提交 事務2讀取到新的未提交記錄 事務1回滾。2.不可重複讀取 nonrepeatable read 不可重複讀,是指在資料庫訪問中,乙個 事務範圍內兩個相同的查詢卻返回了不同資料。例子 事務1讀取某一條記錄 事務2修改事務1...
mysql筆記 事務
寫日誌為什麼比直接寫磁碟要快?使用事務日誌,儲存引擎在修改表的資料時,只需要修改其記憶體拷貝,再把該修改行為記錄到硬碟上的事務日誌中,而不用每次都將修改的資料本身持久到磁碟。事務日誌採用的是追加的方式,因此寫日誌的操作是磁碟上一小塊區域內的順序i o,而不是隨機i o,所以快很多。事務日誌持久以後,...