Innodb隔離級別,MVCC,鎖算法

SQL標準定義了4類隔離級別:

1 Read Uncommitted(讀未提交)。缺點:臟讀(一個事務讀取到另一事務未提交的數據)

2 Read Committed(讀提交)。解決了臟讀問題, 缺點:不可重復讀(同一個事務里面讀取到其他事務commit的數據,主要是針對于update)。

3?Repeatable Read(可重復重讀)。解決了不可重復讀,缺點:幻讀(同一個事務里面讀取到其他事務commit的數據,主要是針對于insert)。

4 Serializable(可串行化)。解決了不可重復讀,缺點:每個讀的數據行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭。

PS : 需要區分:不可重復讀(update)和幻讀(insert|delete)。

幻讀指當用戶讀取某一范圍的數據行時,另一個事務又在該范圍內插入了新行,當用戶再讀取該范圍的數據行時,會發現有新的“幻影” 行。

Innodb默認隔離級別是可重復讀(RR) :

? 1) 使用MVCC(多版本并發控制)來解決不可重復讀問題,

? 2) ?使用間隙鎖(Gap鎖)來解決幻讀。

所以說Innodb存儲引擎在默認隔離的隔離級別下已經能完全保證事物的隔離性要求,即達到SQL標準的Serializable隔離級別。

PS : Innodb存儲引擎支持XA事務,通過XA事務可以來支持分布式事務的實現,需要將隔離級別設置為Serializable。在Serializable這個級別下,select語句也會加上共享鎖(不要看到select就說不會加鎖了)。


一致性的非鎖定讀

MySQL為了減少鎖處理(包括等待其它鎖)的時間,提升并發能力,引入了快照讀的概念(即一致性的非鎖定讀)。

1 Innodb通過多版本并發控制(MVCC)技術來讀取當前時間數據庫中行的數據。如果讀取的正在執行Update,Delete,這時讀取操作不會因此而會等待行上鎖的釋放,相反Innodb會去讀取行的一個快照數據。

2 之所以叫非鎖定讀,因為不需要等待訪問的行上X鎖的釋放。快照的數據是指該行之前版本的數據,通過Undo段(主要用于事務的回滾)來實現。

3 只有Read Committed和Repeatable Read 兩種事務隔離級別才能使用MVCC(Read Uncommited由于是讀到未提交的,所以不存在版本的問題,而Serializable 則會對所有讀取的行加鎖),但是它們對于快照數據的定義是不相同的。

RC:總是讀取被鎖定行的最新一份快照數據;

RR:總是讀取事務開始時的行數據版本。

因此在RC隔離級別下,會產生不可重復讀的問題。因為它總是讀取的最新的快照。


Innodb鎖算法

Innodb有三種行鎖算法:

1) Record Lock:單個行記錄鎖

2 )Gap Lock:間隙鎖,鎖定一個范圍,但不包括本身

3)Next-Key Lock:Gap Lock + Record Lock ,鎖定一個范圍,并且包括本身

默認情況下,InnoDB工作在可重復讀隔離級別下,并且會以Next-Key Lock的方式對數據行進行加鎖,這樣可以有效防止幻讀的發生。Next-Key Lock是行鎖和間隙鎖的組合,當InnoDB掃描索引記錄的時候,會首先對索引記錄加上行鎖(Record Lock),再對索引記錄兩邊的間隙加上間隙鎖(Gap Lock)。加上間隙鎖之后,其他事務就不能在這個間隙修改或者插入記錄。

鎖選擇

例子: update from t1 set v2=0 where v1=5

1)如果v1是唯一索引(包括主鍵索引),使用Record Lock

2)如果v1沒有建立索引,此時會進行全表掃描,掃表的時候,要阻止其他任何的更新操作,所以上升為表鎖

3)如果v1是二級索引,使用Next-Key Lock

?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,656評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,697評論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,855評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,254評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,473評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,014評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,833評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,016評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,273評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,730評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,006評論 2 374

推薦閱讀更多精彩內容