【嚴選】JAVA互聯網架構師專題/分佈式/高併發/微服務
點點我download:JAVA互聯網架構師專題/分佈式/高併發/微服務 mysql
提娶馬:f6r5sql
01 學習攻略數據庫
02億級流量中臺微服務電商平臺、電商項目總體架構詳解、秒殺系統-商品詳情多級緩存優化實戰(一)、電商項目微服務架構拆分及受權中心實戰、從零到一實戰高性能網關服務及受權中心對接、商品搜索實戰(上)。編程
03秒殺系統-訂單交易全鏈路優化實戰(一)、訂單交易系統分佈式事務實戰、分庫分表&分佈式事務&分佈式主鍵(上)、(下)、電商項目併發編程實戰與總結、電商項目微服務中臺架構落地實戰。數組
04億級流量中臺微服務電商平臺、電商項目領域驅動開發DDD探索及實戰、Docker詳解與部署微服務實戰、電商項目Docker Compose總體部署實戰(上)、(下)、Kubernetes快速實戰與核心原理剖析(上)、(下)、Kubernetes微服務電商後臺部署實戰、電商項目壓測與性能調優(上)、(下)、電商項目秒殺全鏈路壓測。緩存
05電商推薦系統、電商推薦系統實戰1、2、3、4、五。微信
06微信億級IM後臺系統、微信億級IM後臺系統架構實戰1、2、3、四。架構
課件 1:併發
MVCC多版本併發控制機制
Mysql在可重複讀隔離級別下如何保證事務交流V(cmL46679910)較高的隔離性,咱們上節課給你們演示過,一樣的sql查詢語句在一個事務裏屢次執行查詢結果相同,就算其它事務對數據有修改也不會影響當前事務sql語句的查詢結果。這個隔離性就是靠MVCC(Multi-Version Concurrency Control)機制來保證的,對一行數據的讀和寫兩個操做默認是不會經過加鎖互斥來保證隔離性,避免了頻繁加鎖互斥,而在串行化隔離級別爲了保證較高的隔離性是經過將全部操做加鎖互斥來實現的。
Mysql在讀已提交和可重複讀隔離級別下都實現了MVCC機制。分佈式
undo日誌版本鏈與read view機制詳解
undo日誌版本鏈是指一行數據被多個事務依次修改事後,在每一個事務修改完後,Mysql會保留修改前的數據undo回滾日誌,而且用兩個隱藏字段trx_id和roll_pointer把這些undo日誌串聯起來造成一個歷史記錄版本鏈(見下圖,需參考視頻裏的例子理解)。
在可重複讀隔離級別,當事務開啓,執行任何查詢sql時會生成當前事務的一致性視圖read-view,該視圖在事務結束
以前都不會變化(若是是讀已提交隔離級別在每次執行查詢sql時都會從新生成),這個視圖由執行查詢時全部未提交事
務id數組(數組裏最小的id爲min_id)和已建立的最大事務id(max_id)組成,事務裏的任何sql查詢結果須要從對應
版本鏈裏的最新數據開始逐條跟read-view作比對從而獲得最終的快照結果。
版本鏈比對規則:
1. 若是 row 的 trx_id 落在綠色部分( trx_id<min_id ),表示這個版本是已提交的事務生成的,這個數據是可見的;
2. 若是 row 的 trx_id 落在紅色部分( trx_id>max_id ),表示這個版本是由未來啓動的事務生成的,是不可見的(若
row 的 trx_id 就是當前本身的事務是可見的);
3. 若是 row 的 trx_id 落在黃色部分(min_id <=trx_id<= max_id),那就包括兩種狀況
a. 若 row 的 trx_id 在視圖數組中,表示這個版本是由還沒提交的事務生成的,不可見(若 row 的 trx_id 就是當前自
己的事務是可見的);
b. 若 row 的 trx_id 不在視圖數組中,表示這個版本是已經提交了的事務生成的,可見。
對於刪除的狀況能夠認爲是update的交流V(cmL46679910)特殊狀況,會將版本鏈上最新的數據複製一份,而後將trx_id修改爲刪除操做的
trx_id,同時在該條記錄的頭信息(record header)裏的(deleted_flag)標記位寫上true,來表示當前記錄已經被
刪除,在查詢時按照上面的規則查到對應的記錄若是delete_flag標記位爲true,意味着記錄已被刪除,則不返回數
據。
注意:begin/start transaction 命令並非一個事務的起點,在執行到它們以後的第一個修改操做InnoDB表的語句,
事務才真正啓動,纔會向mysql申請事務id,mysql內部是嚴格按照事務的啓動順序來分配事務id的。
總結:
MVCC機制的實現就是經過read-view機制與undo版本鏈比對機制,使得不一樣的事務會根據數據版本鏈對比規則讀取
同一條數據在版本鏈上的不一樣版本數據。
Innodb引擎SQL執行的BufferPool緩存機制
爲何Mysql不能直接更新磁盤上的數據並且設置這麼一套複雜的機制來執行SQL了?
由於來一個請求就直接對磁盤文件進行隨機讀寫,而後更新磁盤文件裏的數據性能可能至關差。
由於磁盤隨機讀寫的性能是很是差的,交流V(cmL46679910)因此直接更新磁盤文件是不能讓數據庫抗住很高併發的。
Mysql這套機制看起來複雜,但它能夠保證每一個更新請求都是更新內存BufferPool,而後順序寫日誌文件,同時還能
保證各類異常狀況下的數據一致性。
更新內存的性能是極高的,而後順序寫磁盤上的日誌文件的性能也是很是高的,要遠高於隨機讀寫磁盤文件。正是經過這套機制,才能讓咱們的MySQL數據庫在較高配置的機器上每秒能夠抗下幾乾的讀寫請求。