大白話講解併發控制的悲觀鎖與樂觀鎖 / 高效能 MySQL 筆記
MySQL架構和歷史
MySQL邏輯架構
-
第一層處理網路連線等, 比如連結認證,授權等
-
第二層是 MySQL 的核心, 用來解析優化 SQL 語句, 設計快取, 以及各種函式的實現, 包括儲存過程, 觸發器, 檢視等
-
第三層包括儲存引擎, 負責具體資料的存取, 伺服器通過 API 和儲存引擎通訊, 儲存引擎只執行來自上層的請求
每個客戶端連線都在伺服器程序中有一個執行緒, 伺服器負責快取執行緒, 不需要手動管理
伺服器處理連線流程
graph LR
start[客戶端連線]
auth[檢查使用者名稱密碼]
access[檢查是否有對應資源的處理許可權]
query[執行SQL 操作]
start-->auth
auth-->access
access-->query
併發控制
MySQL 會在兩個層面做併發控制: 伺服器層和儲存引擎層
-
讀寫鎖
-
讀鎖(共享鎖)是共享的, 互相不阻塞
-
寫鎖(排他鎖)是排他的, 給定時間內, 只有一個使用者能寫入
-
表鎖在伺服器層實現, 行鎖在儲存引擎層實現
事務
-
資料庫事務具有 原子性, 一致性, 隔離性和永續性, 簡稱 ACID
-
使用事務會增加額外的開銷
-
隔離級別
-
READ UNCOMMITTED 未提交讀, 就是在A事務還沒有提交的時候, B操作可以讀取 A 修改的資料, 即髒讀, 一般不使用這種隔離方式
-
READ COMMITTED 提交讀, 事務在提交之前, 對其他的事務不可見, 即只對自己事務內部的資料有影響, 也叫不可重複讀
-
REPEATEABLE READ 可重複讀, A 事務本身對資料的修改對 A 事務後邊的語句也不起作用, 所有的 SQL 操作的資料都來自資料庫, 這是 MySQL 預設的事務隔離級別
-
SERIALIZABLE 可序列化, 這種會在事務操作的每一行記錄上都加一個鎖, 會嚴重降低效能, 但是資料一致性比較高
-
事務日誌是順序 I/O, 日誌採用追加的方式
-
MySQL 的每個查詢都被當成一個事務執行
只工作在 REPEATEABLE 和 READ COMMITED 兩種隔離級別下
-
為每一行記錄增加兩個欄位, 一個儲存行的建立時間, 另一個儲存行的過期/刪除時間, 具體儲存的是一個版本號, select 的時候會首先讀建立版本號小於或等於當前事務版本號, 並且刪除版本號為空或者大於當前事務的版本號, inssert 更新建立版本號, delete 會更新刪除版本號, update 更新建立版本號為當前系統版本號, 更新刪除版本號為之前的建立版本號
-
Innodb 的 MVCC (多版本併發控制) 的實現方式
儲存引擎
-
InnoDB
-
支援行級鎖
-
支援事務
-
全表使用 B+ tree 實現
-
資料只存在葉子節點上
-
MyISAM
-
不支援行級鎖, 只支援表鎖
-
資料檔案和索引檔案分開
-
不支援事務
-
可以通過壓縮表技術提高效能
-
索引使用 B+ tree 實現
1、具有1-5工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加群。
2、在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加群。
3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的,可以加群。
4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加群。
5. 群號:高階架構群 283943715 備註好資訊!
6.阿里Java高階架構師免費直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶著大家全面、科學地建立自己的技術體系和技術認知!