必須掌握 MySQL ACID 特性

2021-10-10 17:27:54 字數 1645 閱讀 6310

在關係型資料庫管理系統中,乙個邏輯工作單元要成為事務,必須滿足這 4 個特性,即所謂的 acid:原子性(atomicity)、一致性(consistency)、隔離性(isolation)和永續性(durability)。

原子性:事務是乙個原子操作單元,其對資料的修改,要麼全都執行,要麼全都不執行。修改—》buffer pool修改—》刷盤。可能會有下面兩種情況:

事務提交了,如果此時buffer pool的髒頁沒有刷盤,如何保證修改的資料生效? redo

如果事務沒提交,但是buffer pool的髒頁刷盤了,如何保證不該存在的資料撤銷?undo

每乙個寫事務,都會修改bufferpool,從而產生相應的redo/undo日誌,在buffer pool 中的頁被刷到磁碟之前,這些日誌資訊都會先寫入到日誌檔案中,如果 buffer pool 中的髒頁沒有刷成功,此時資料庫掛了,那在資料庫再次啟動之後,可以通過 redo 日誌將其恢復出來,以保證髒頁寫的資料不會丟失。如果髒頁重新整理成功,此時資料庫掛了,就需要通過undo來實現了。

永續性:指的是乙個事務一旦提交,它對資料庫中資料的改變就應該是永久性的,後續的操作或故障不應該對其有任何影響,不會丟失。

如下圖所示,乙個「提交」動作觸發的操作有:binlog落地、傳送binlog、儲存引擎提交、flush_logs,check_point、事務提交標記等。這些都是資料庫保證其資料完整性、永續性的手段。

mysql的永續性也與wal技術相關,redo log在系統crash重啟之類的情況時,可以修復資料,從而保障事務的永續性。通過原子性可以保證邏輯上的永續性,通過儲存引擎的資料刷盤可以保證物理上的永續性。

隔離性:指的是乙個事務的執行不能被其他事務干擾,即乙個事務內部的操作及使用的資料對其他的併發事務是隔離的。

innodb 支援的隔離性有 4 種,隔離性從低到高分別為:讀未提交、讀提交、可重複讀、可序列化。鎖和多版本控制(mvcc)技術就是用於保障隔離性的(後面課程詳解)。

一致性:指的是事務開始之前和事務結束之後,資料庫的完整性限制未被破壞。一致性包括兩方面的內容,分別是約束一致性和資料一致性。

約束一致性:建立表結構時所指定的外來鍵、check、唯一索引等約束,可惜在 mysql 中不支援

check 。

資料一致性:是乙個綜合性的規定,因為它是由原子性、永續性、隔離性共同保證的結果,而不是

單單依賴於某一種技術

一致性也可以理解為資料的完整性。資料的完整性是通過原子性、隔離性、永續性來保證的,而這3個特性又是通過 redo/undo 來保證的。邏輯上的一致性,包括唯一索引、外來鍵約束、check 約束,這屬於業務邏輯範疇。

acid 及它們之間的關係如下圖所示,4個特性中有3個與 wal 有關係,都需要通過 redo、undo 日誌來保證等。

wal的全稱為write-ahead logging,先寫日誌,再寫磁碟。

必須掌握的排序

大神總結的很好。學而時習之,善於總結。非常恨那些把演算法排序之類的搞得異常麻煩的人,盡可能簡單一點,簡單了,容易理解了,才好記,上了戰場,才用得著.人家的不好用,只好自己總結,重寫原理與過程.口訣 冒泡 n 1,n i 1,比的是j與j 1 插入 n 1,i 1,比的是i 1與j 選擇 n,n,開始...

必須掌握 MySQL索引原理

mysql官方對索引定義 是儲存引擎用於快速查詢記錄的一種資料結構。需要額外開闢空間和資料維護工作。索引是物理資料頁儲存,在資料檔案中 innodb,ibd檔案 利用資料頁 page 儲存。索引可以加快檢索速度,但是同時也會降低增刪改操作速度,索引維護需要代價。索引涉及的理論知識 二分查詢法 has...

必須掌握 MySQL查詢優化

開啟慢查詢日誌 檢視 mysql 資料庫是否開啟了慢查詢日誌和慢查詢日誌檔案的儲存位置的命令如下 show variables like slow query log 通過如下命令開啟慢查詢日誌 set global slow query log on set global slow query l...