MySQL基礎架構和事務

Algoric發表於2019-04-10

一、 資料庫結構:

MySQL基礎架構和事務

1.1 Server層:

  1. 聯結器 許可權驗證 儘量使用長連線,但是長連線會消耗記憶體,可以定時清理,也可以重新初始化連結資源
  2. 查快取(一般不用,除非讀多寫少 8.0移除)
  3. 分析器 詞法分析,語法分析,語法解析
  4. 優化器 使用哪個索引 表連線順序
  5. 執行器 執行語句,查詢是否具有讀寫許可權

1.2 儲存引擎層

  • InnoDB(預設儲存引擎)
  • MyISAM(不支援事務)

二、 資料庫日誌

2.1 redo log

1.redo log 是InnoDB引擎特有的日誌 迴圈寫入固定大小記憶體
2.WAL,先寫日誌再寫磁碟

innodb_flush_log_at_trx_commit 引數 決定寫磁碟時機
設定為1: 系統預設模式,每次事務提交時MySQL都會把log buffer的資料寫入log file,並且flush(刷到磁碟)中

2.2 binlog

追加寫入檔案,到達指定大小切換另一個檔案
三個用途:
1.恢復:利用binlog日誌恢復資料庫資料
2.複製:主從同步
3.審計:通過二進位制日誌中的資訊來進行審計,判斷是否有對資料庫進行注入攻擊

三種模式:
1.statement 記錄的是修改SQL語句
2.row 記錄的是每行實際資料的變更,記兩條,更新前和更新後
3.mixed statement和row模式的混合

2.3 兩階段提交策略

1.先在引擎層寫redolog,redolog處於prepare
2.然後在server寫binlog
3.事務提交,redolog commit提交寫入磁碟

崩潰恢復 在1階段完成後崩潰,回滾寫入的redolog
在2階段完成後崩潰,因為已經寫入binlog所以不回滾

三、事物隔離級別

事物隔離級別 髒讀 不可重複讀 幻讀
讀未提交(read-uncommitted)
讀已提交(read-committed)
可重複讀(repeatable-read)
序列化(serializable)
髒讀

在一個事務中,讀取了其他事務未提交的資料

MySQL基礎架構和事務
不可重複讀

在一個事務中,同一行記錄被訪問了兩次卻得到了不同的結果

MySQL基礎架構和事務
幻讀

在一個事務中,同一個範圍內的記錄被讀取時,其他事務向這個範圍新增了新的記錄。

MySQL基礎架構和事務

前面髒讀和不可重複讀容易理解,幻讀稍微難一點

假設圖一test開始是空表,事物1第一次查詢得到空表,事物2在事物1執行期間插入一條資料, 事物1第二次查詢由於滿足可重複讀,所以查詢結果依然為空,但是事物1插入同樣一條資料,報重複主鍵錯誤

serialzable級別下可以避免以上三種情況

事務隔離的實現

檢視:檢視可以理解為資料副本

不同時刻開啟的事務會建立不同的檢視,後續直接從檢視讀取資料,達到資料隔離,當然資料隔離還需要資料庫鎖的幫助。

同一資料庫記錄可以在系統中存在多個版本,這就是MVCC。

長事務意味著系統裡面會存在很老的事務檢視。由於這些事務隨時可能訪問資料庫裡面的 任何資料,所以這個事務提交之前,資料庫裡面它可能用到的回滾記錄都必須保留,這就 會導致大量佔用儲存空間。所以需要避免長事務

相關文章