前言
開始學習mysql,總結一下一些mysql的基本概念。
PS: 我只是知識的搬運工
基本概念
- 邏輯架構
- 事務
- 鎖
- 隔離級別
- MVCC
邏輯架構
一般來說,對于sql語句,mysql的操作流程如下:
權限驗證->分析器->優化器->存儲引擎
對于查詢多了一步查詢緩存,也就是:
權限驗證->查詢緩存->權限驗證->分析器->優化器->存儲引擎
事務
事務就是mysql中的最小操作單元,遵循ACID原則,如下:
- 原子性:要不全部成功,要不全部撤銷
- 一致性:數據庫正確地改變狀態后,數據庫的一致性約束沒有被破壞
- 隔離性:事務之間相互獨立,互不干擾
- 持久性:事務的提交結果,將持久保存在數據庫中(通過redo和undo來實現得)
原子性約束事務作為一個整體,一致性保證數據庫在事務操作下的狀態遷移。即事務可能是一組復雜操作,但是作為一個整體,只能是都成功,或者都失敗。在成功,失敗或者事務異常時,一致性保證保證事務操作是可預測的。
不說隔離性和持久性,在mongo中也有原子操作的概念,遵循原子性和一致性。
一般來說,mysql會設置自動提交。即非顯示的開啟事務,一條sql語句會被視為一次事務,在結束時自動提交。
鎖
探索Mysql鎖機制(一)——樂觀鎖&悲觀鎖
探索Mysql鎖機制(二)——共享鎖&排他鎖&意向鎖&間隙鎖
鎖粒度
一般來說,一個東西總有其作用域,鎖也一樣。粒度有表鎖、行鎖,見名知意。
隔離級別
事務并發產生的問題:
- 第一類丟失更新
- 臟讀
- 重復讀
- 第二類丟失更新
- 幻讀
隔離級別:
- RU
- RC
解決第一類丟失更新 - RR(默認)
沒有解決幻讀(幻讀需間隙鎖解決) - 串行
MVCC
一般來說,在事務中強制的加鎖都是一種悲觀鎖的做法,保證了操作最大程度的獨占性,但是對于并發來說并不友好。MVCC是一種樂觀鎖的做法,采用版本號來控制數據的正確性。版本號包括版本號,刪除版本號。
規則
- 查詢:只查詢小于等于當前事務版本號和刪除版本大于當前事務版本號的數據,保證數據處于當前時間的正確狀態。
- 插入:事務版本號更新行版本號
- 刪除:事務版本號更新刪除版本號
- 更新:插入一條新的數據,保存事務版本號為新數據的版本號,更新事務版本號為老數據的刪除版本號。
事務版本號為每次事務開始遞增。
對應行版本號,也可以有數據版本號,即針對某行某個字段設置版本號。
對于沒有事務概念的mongo來說,用版本管理數據就是一件理所當然的事情了。