MySQL中的鎖2-事務隔離級別

數據庫中并發(fā)存在的問題

數據庫能夠讓應用程序并發(fā)訪問,在并發(fā)訪問數據庫實例過程中可能會出現以下4種現象旁仿。

  1. 丟失更新。兩個事務都同時更新一行數據赠制,一個事務對數據的更新把另一個事務對數據的更新覆蓋了;
  2. 臟讀。一個事務讀取了另外一個事務還沒有提交的操作溪胶,這比較危險,因為另一個事務的操作可能會回滾稳诚;
  3. 不可重復讀。一個事務對同一行數據進行重復讀取瀑踢,但是每次讀取卻得到不同的數據扳还;
  4. 幻讀。一個事務對某個范圍的數據進行兩次讀取橱夭,得到的記錄數卻不相同氨距,這是因為兩次讀取之前,另外一個事務可能增加或刪除了一條范圍之內的數據棘劣。

這4種現象即能把它們看成是并發(fā)產生的問題俏让,也可以不把它們理解成并發(fā)問題。具體還要聯(lián)系實際應用場景去分析茬暇,主要看應用中是否允許某種現象的存在首昔。大部分情況下我們認為丟失更新和臟讀是個問題,應該要避免糙俗,可以通過應用不同的隔離級別來實現勒奇。

談談丟失更新

MySQL本身不會產生丟失更新,因為在對某一行進行更新操作時(此時事務尚未提交)巧骚,Innodb存儲引擎會在該行上加一個X鎖赊颠,這是其他事務再對該行進行更新操作時格二,會被阻塞直到該行上的X鎖被釋放后才能夠執(zhí)行。即使在Read Uncommit的事務隔離級別下竣蹦,也不會產生丟失更新的現象顶猜。

雖然數據本身不會產生丟失更新,但是實際應用程序中可能會產生另外一種邏輯意義上的丟失更新問題痘括。例如出現下面的情況時长窄,就會產生丟失更新:

  1. 事務T1查詢某一行數據,放入本地內存远寸,并顯示給終端用戶User1進行操作抄淑;
  2. 事務T2查詢同一行數據,放入本地內存驰后,并顯示給終端用戶User2進行操作肆资;
  3. User1修改這行記錄,更新數據庫并提交灶芝;
  4. User2修改這行記錄郑原,更新數據庫并提交。

這個過程中User1的修改就相當于“丟失了”夜涕。作為程序員而言犯犁,編寫上面這種邏輯的代碼還是很常見的。
那如何解決這個問題呢女器?這種情況下事務不能并發(fā)的操作酸役,要讓事務變成串行化執(zhí)行。具體做法為:步驟1和步驟2的查詢語句中都加入for update結尾驾胆,這樣用戶讀取同一行記錄時就會加上X鎖涣澡。如果步驟1獲取到了X鎖時,步驟2就會阻塞直到步驟1和步驟3執(zhí)行完釋放鎖后才開始執(zhí)行丧诺。

隔離級別

對于上面講到的并發(fā)中存在的問題入桂,可以通過設置不同的隔離級別來解決。事務的特性中有一大特性是隔離性驳阎,什么是隔離性抗愁?隔離性指的是一個事務所做的修改,對其他事務是不可見的呵晚,就像這兩個事務是串行執(zhí)行蜘腌。

隔離級別可以看成是對隔離性不同程度的實現,嚴格意義上講只有隔離級別為Serializable的事務才具有隔離性劣纲。如果所有的數據庫操作都串行化執(zhí)行逢捺,那性能就會很低,所以出于對性能的考慮才會有其他隔離性稍差但是性能較好的隔離級別癞季。

SQL標準中定義了4種隔離級別

  1. Read Uncommitted劫瞳,該隔離級別不會有丟失更新倘潜;
  2. Read Committed,該隔離級別不會有丟失更新志于、臟讀涮因;
  3. Repeatable Read,該隔離級別不會有丟失更新伺绽、臟讀养泡、不可重復讀;
  4. Serializable奈应,該隔離級別不會有丟失更新澜掩、臟讀、不可重復度杖挣、幻讀肩榕。

MySQL實現了這4種隔離級別,默認的隔離級別在Innodb中是Repeatable Read惩妇。而Oracle數據庫只實現了Read Committed和Serializable兩種株汉,它的默認隔離級別是Read Committed。

Innodb在Repeatable Read隔離級別中歌殃,通過Next-Key Lock鎖的算法來避免幻讀的產生乔妈,這與其他關系型數據庫不同。所以說氓皱,InnoDB存儲引擎在默認的Repeatable Read隔離級別下已經能完全保證事務的隔離性要求路召,即達到SQL標準的Serializable隔離級別。

隔離級別的設置與查看

可以通過set [ global | session ] transaction_isolation='read-uncommitted | read-committed | repeatable-read | serializable'來設置事務的隔離級別波材。
如果要在mysql啟動的時候設置事務的默認隔離級別优训,可以修改Mysql的配置文件my.cnf,在[mysqld]中添加如下行:

[mysqld]
transaction_isolation=read-committed

查看當前的事務隔離級別可以使用select @@transaction_isolation
查看全局的事務隔離級別可以使用select @@global.transaction_isolation.

不同隔離級別下鎖的實現

隔離性通過鎖來實現各聘,不同的隔離級別對應不同的加鎖策略。下面來看看不同事務隔離級別的加鎖策略:

Read Uncommitted

讀操作(不顯式加鎖的select語句)不加鎖抡医;
寫操作加行級X鎖躲因,并到事務結束之后釋放。

Read Committed

讀操作使用MVCC;
寫操作使用使用行鎖中的記錄鎖忌傻,且RC隔離級別下沒有GAP鎖(唯一性的檢查約束和外鍵約束的檢查需要使用gap lock)
注意:設置了RC隔離級別后大脉,binlog_format要設置為row,否則會出現主從不一致的現象水孩。

Repeatable Read

讀操作使用MVCC;
寫操作使用行鎖镰矿,包括記錄鎖、GAP鎖俘种、Next-key Lock

Serializable

讀操不再使用MVCC,InnoDB引擎會自動在每個select語句后加上lock in share mode秤标。
寫操作使用行鎖绝淡。

參考
MySQL數據庫事務各隔離級別加鎖情況--read uncommitted篇

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市苍姜,隨后出現的幾起案子牢酵,更是在濱河造成了極大的恐慌,老刑警劉巖衙猪,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件馍乙,死亡現場離奇詭異,居然都是意外死亡垫释,警方通過查閱死者的電腦和手機丝格,發(fā)現死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棵譬,“玉大人显蝌,你說我怎么就攤上這事∶4” “怎么了琅束?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長算谈。 經常有香客問我涩禀,道長,這世上最難降的妖魔是什么然眼? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任艾船,我火速辦了婚禮,結果婚禮上高每,老公的妹妹穿的比我還像新娘屿岂。我一直安慰自己,他們只是感情好鲸匿,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布爷怀。 她就那樣靜靜地躺著,像睡著了一般带欢。 火紅的嫁衣襯著肌膚如雪运授。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天乔煞,我揣著相機與錄音吁朦,去河邊找鬼。 笑死渡贾,一個胖子當著我的面吹牛逗宜,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼纺讲,長吁一口氣:“原來是場噩夢啊……” “哼擂仍!你這毒婦竟也來了?” 一聲冷哼從身側響起刻诊,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤防楷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后则涯,有當地人在樹林里發(fā)現了一具尸體复局,經...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年粟判,在試婚紗的時候發(fā)現自己被綠了亿昏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡档礁,死狀恐怖角钩,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情呻澜,我是刑警寧澤递礼,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站羹幸,受9級特大地震影響脊髓,放射性物質發(fā)生泄漏。R本人自食惡果不足惜栅受,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一将硝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧屏镊,春花似錦依疼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至棍丐,卻和暖如春弟翘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背骄酗。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留悦冀,地道東北人趋翻。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像盒蟆,于是被迫代替她去往敵國和親踏烙。 傳聞我的和親對象是個殘疾皇子师骗,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內容