1.redo log 是InnoDB引擎特有的日誌 循環寫入固定大小內存
2.WAL,先寫日誌再寫磁盤數據庫
innodb_flush_log_at_trx_commit 參數 決定寫磁盤時機
設置爲1: 系統默認模式,每次事務提交時MySQL都會把log buffer的數據寫入log file,而且flush(刷到磁盤)中緩存
追加寫入文件,到達指定大小切換另外一個文件
三個用途:
1.恢復:利用binlog日誌恢復數據庫數據
2.複製:主從同步
3.審計:經過二進制日誌中的信息來進行審計,判斷是否有對數據庫進行注入攻擊優化
三種模式:
1.statement 記錄的是修改SQL語句
2.row 記錄的是每行實際數據的變動,記兩條,更新前和更新後
3.mixed statement和row模式的混合日誌
1.先在引擎層寫redolog,redolog處於prepare
2.而後在server寫binlog
3.事務提交,redolog commit提交寫入磁盤cdn
崩潰恢復 在1階段完成後崩潰,回滾寫入的redolog
在2階段完成後崩潰,由於已經寫入binlog因此不回滾server
事物隔離級別 | 髒讀 | 不可重複讀 | 幻讀 |
---|---|---|---|
讀未提交(read-uncommitted) | 是 | 是 | 是 |
讀已提交(read-committed) | 否 | 是 | 是 |
可重複讀(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
在一個事務中,讀取了其餘事務未提交的數據blog
在一個事務中,同一行記錄被訪問了兩次卻獲得了不一樣的結果索引
在一個事務中,同一個範圍內的記錄被讀取時,其餘事務向這個範圍添加了新的記錄。事務
前面髒讀和不可重複讀容易理解,幻讀稍微難一點內存
假設圖一test開始是空表,事物1第一次查詢獲得空表,事物2在事物1執行期間插入一條數據, 事物1第二次查詢因爲知足可重複讀,因此查詢結果依然爲空,可是事物1插入一樣一條數據,報重複主鍵錯誤
serialzable級別下能夠避免以上三種狀況
視圖:視圖能夠理解爲數據副本
不一樣時刻開啓的事務會建立不一樣的視圖,後續直接從視圖讀取數據,達到數據隔離,固然數據隔離還須要數據庫鎖的幫助。
同一數據庫記錄能夠在系統中存在多個版本,這就是MVCC。
長事務意味着系統裏面會存在很老的事務視圖。因爲這些事務隨時可能訪問數據庫裏面的 任何數據,因此這個事務提交以前,數據庫裏面它可能用到的回滾記錄都必須保留,這就 會致使大量佔用存儲空間。因此須要避免長事務