MySQL基礎架構和事務

1、 數據庫結構:

1.1 Server層:

  1. 鏈接器 權限驗證 儘可能使用長鏈接,可是長鏈接會消耗內存,能夠定時清理,也能夠從新初始化連接資源
  2. 查緩存(通常不用,除非讀多寫少 8.0移除)
  3. 分析器 詞法分析,語法分析,語法解析
  4. 優化器 使用哪一個索引 錶鏈接順序
  5. 執行器 執行語句,查詢是否具備讀寫權限

1.2 存儲引擎層

  • InnoDB(默認存儲引擎)
  • MyISAM(不支持事務)

2、 數據庫日誌

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提交寫入磁盤cdn

崩潰恢復 在1階段完成後崩潰,回滾寫入的redolog
在2階段完成後崩潰,由於已經寫入binlog因此不回滾server

3、事物隔離級別

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

在一個事務中,讀取了其餘事務未提交的數據blog

不可重複讀

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

幻讀

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

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

假設圖一test開始是空表,事物1第一次查詢獲得空表,事物2在事物1執行期間插入一條數據, 事物1第二次查詢因爲知足可重複讀,因此查詢結果依然爲空,可是事物1插入一樣一條數據,報重複主鍵錯誤

serialzable級別下能夠避免以上三種狀況

事務隔離的實現

視圖:視圖能夠理解爲數據副本

不一樣時刻開啓的事務會建立不一樣的視圖,後續直接從視圖讀取數據,達到數據隔離,固然數據隔離還須要數據庫鎖的幫助。

同一數據庫記錄能夠在系統中存在多個版本,這就是MVCC。

長事務意味着系統裏面會存在很老的事務視圖。因爲這些事務隨時可能訪問數據庫裏面的 任何數據,因此這個事務提交以前,數據庫裏面它可能用到的回滾記錄都必須保留,這就 會致使大量佔用存儲空間。因此須要避免長事務

相關文章
相關標籤/搜索