1,MySQL架構mysql
2,事務的ACID屬性,由存儲引擎實現,表鎖,行鎖依賴於引擎的實現方式,InnoDB,XtraDB實現了ACIDsql
3,事務隔離級別架構
1)Read Uncommited,未提交讀,實際並不會比其級別性能好多少,通常不採用此級別,可是會產生:
併發
髒讀:事務能夠讀取未提交的數據。性能
2)Read Commited,提交讀,大多數db的默認隔離級別(mysql不是),解決了髒讀,可是會產生:大數據
不可重複讀:一個事務在未提交數據時對其它事務不可見,致使(其它事務)讀操做兩次一樣的查詢,可能獲得不一樣的結果。
spa
3)Repeatable Read,可重複讀,解決了髒讀,也保證在同一個事務中屢次讀取一樣記錄的結果是一致的(不可重複讀),可是會產生:
操作系統
幻讀:某個事務正在讀取某範圍內的記錄時,另一個事務在該範圍內插入了新的記錄,以前的事務再次讀取時,就產生了幻行。
日誌
InnoDb、XtraDB存儲引擎經過多版本併發控制(MVCC)解決了幻讀,也是MySQL默認的隔離級別。
事務
4)Serializable,可串行化,最高隔離級別,使事務串行執行,避免幻讀問題。這種隔離級別會在讀每一行數據時加鎖,因此容易致使鎖超時或竟爭問題,實際應用中不多使用此級別,要在沒有併發的狀況下才會考慮使用。
備註:
不可重複讀與幻讀的定義很是類似,但能夠這麼理解:
1)不可重複讀側重於描述update的狀況
2)幻讀側重於描述insert/delete的狀況
4,死鎖
是指兩個或者多個事務在同一資源上相互佔用,並請求鎖定對方資源佔用資源,從而致使惡性循環的現象。當多個事務試圖以不一樣的順序鎖定資源時,就可能會產生死鎖。多個事務同時鎖定同一個資源時,也會產生死鎖。
5,MySQL提供兩種事務引擎:InnoDB,NDB Cluster
6,InnoDB採用兩階段鎖定協議,在事務執行過程當中,隨時能夠鎖定,只有在執行COMMIT或ROLLBACK時才所有釋放鎖。
7,存儲引擎選擇:
1)日誌型應用,這類應用對insert的要求很高,使用MyISAM,Archive引擎開銷低,insert速度很是快(只作Insert/Select操做,表級鎖);另外,若是同時須要select數據,因爲這種引擎是表級鎖,因此性能會明顯降低,能夠採用主/備庫的方式,將主庫insert數據複製到備庫進行select,或者對錶進行日期命名,查詢的時候查其它沒進行insert的表tb_16_月_日;
2)只讀或大部份狀況下只讀,因爲MyISAM(先將數據寫入到內存,而後等待操做系統按期將數據寫入磁盤)引擎產生數據丟失的狀況比較嚴重,因此InnoDB優於MyISAM;
3)訂單處理,因爲須要事務因此InnoDB;
4)CD-ROM應用,MyISAM或MyISAM壓縮表,只讀,壓縮節省空間,方便複製;
5)大數據量,InnoDB 3-5TB/庫,10TB選用數倉。