一、 資料庫結構:
1.1 Server層:
- 聯結器 許可權驗證 儘量使用長連線,但是長連線會消耗記憶體,可以定時清理,也可以重新初始化連結資源
- 查快取(一般不用,除非讀多寫少 8.0移除)
- 分析器 詞法分析,語法分析,語法解析
- 優化器 使用哪個索引 表連線順序
- 執行器 執行語句,查詢是否具有讀寫許可權
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) | 否 | 否 | 否 |
髒讀
在一個事務中,讀取了其他事務未提交的資料
不可重複讀
在一個事務中,同一行記錄被訪問了兩次卻得到了不同的結果
幻讀
在一個事務中,同一個範圍內的記錄被讀取時,其他事務向這個範圍新增了新的記錄。
前面髒讀和不可重複讀容易理解,幻讀稍微難一點
假設圖一test開始是空表,事物1第一次查詢得到空表,事物2在事物1執行期間插入一條資料, 事物1第二次查詢由於滿足可重複讀,所以查詢結果依然為空,但是事物1插入同樣一條資料,報重複主鍵錯誤
serialzable級別下可以避免以上三種情況
事務隔離的實現
檢視:檢視可以理解為資料副本
不同時刻開啟的事務會建立不同的檢視,後續直接從檢視讀取資料,達到資料隔離,當然資料隔離還需要資料庫鎖的幫助。
同一資料庫記錄可以在系統中存在多個版本,這就是MVCC。
長事務意味著系統裡面會存在很老的事務檢視。由於這些事務隨時可能訪問資料庫裡面的 任何資料,所以這個事務提交之前,資料庫裡面它可能用到的回滾記錄都必須保留,這就 會導致大量佔用儲存空間。所以需要避免長事務