標籤:off span commit ons 四種 分享 tab mon https
最近對有些同學問了我下事務的一些相關知識,在高並發下,事務有什麼效能影響? 會不會有堵塞的問題? mysql是如何處理這些的。。。。。突然印象中記得很久之前研究過,可是尼瑪,忘了。為了重新撿起知識。於是再次進去了深入分析和學習。平時工作忙比較少寫部落格,今天開始多學會總結和分享啦。
開始時候,我們首先得瞭解事務的ACID四個特徵(簡單,不需再說),隔離的四個層級,innodb的mvcc(多版本並發控制),redo/undo 等等。
先說交易隔離等級:
1.Read Uncommitted(未提交讀) ---------> read-uncommitted
2.Read Committed (提交讀) --------> read-committed
3.Repeatable Read (可重讀) mysql 預設層級 ---------> repeatable-read
4.Serializable (序列化)註:事務層級最高,串列執行 ---------> serializable
說事務隔離區別前,先簡單說一下怎麼設定系統交易隔離等級和會話交易隔離等級
查看InnoDB儲存引擎 系統級的隔離等級 和 會話級的隔離等級
select @@global.tx_isolation,@@tx_isolation; 更改會話和系統隔離等級 set session tx_isolation=‘read-uncommitted‘;//值看上面 “--->”部分 set global tx_isolation=‘read-uncommitted‘; //值看上面"--->"部分
下面以單詞首字母作為簡稱分析:
1、RU 未提交讀
容易造成髒資料:
A 和 B 兩個執行個體作為例子
A:
B:
認真看看,尼瑪,AB開了未提交隔離模式,B就直接讀取A中沒有添加的插入那行了。造成了嚴重的髒資料。提交讀,可以幫你解決這個問題。
2、RC (提交讀)
A:
B:
A插入新行,可是在事務B裡查詢兩次,兩次結果不一樣,明顯出現了不可重複讀取的情況。前後兩次不一致。重複讀可以給你解決這個問題。
3、RR (可重複讀)
A:
B:
呵呵,A新增了一行,並且commit,可是在B的事務裡,前後兩次資料並沒有變化。(mysql預設交易隔離等級)
但是這會有出現一種幻讀現象,比如,A事務插了一條,B事務由於查詢前後不變,當B去插同一條時候,會報錯。
這個是mysql最常用類型。
4、Serializable (串列模式)
A 事務並沒有添加的時候,B根本不能往裡面插資料。。。。。。
這種類型,無論是從效率來說還是從實質來說,應用情境不多。
(試著類型時候,記得把autocommit 關了,不然沒有效果) set autocommit=off;
呵呵,從以上四種事務層級來說不同有不同應用。下次講講mvcc的,適合RC RR 。
----------小龍說法,有不同觀點有不同見解可以留下意見哈。
mysql 事務分析小筆記--01