mysql解決死鎖問題

一盗扒、什么是死鎖

官方定義如下:兩個事務都持有對方需要的鎖,并且在等待對方釋放缀去,并且雙方都不會釋放自己的鎖侣灶。

這個就好比你有一個人質,對方有一個人質缕碎,你們倆去談判說換人褥影。你讓對面放人,對面讓你放人咏雌。

死鎖的形成

二凡怎、為什么會形成死鎖

看到這里,也許你會有這樣的疑問赊抖,事務和談判不一樣统倒,為什么事務不能使用完鎖之后立馬釋放呢?居然還要操作完了之后一直持有鎖氛雪?這就涉及到 MySQL 的并發(fā)控制了房匆。

MySQL的并發(fā)控制有兩種方式,一個是 MVCC报亩,一個是兩階段鎖協(xié)議浴鸿。那么為什么要并發(fā)控制呢?是因為多個用戶同時操作 MySQL 的時候捆昏,為了提高并發(fā)性能并且要求如同多個用戶的請求過來之后如同串行執(zhí)行的一樣(可串行化調(diào)度)赚楚。具體的并發(fā)控制這里不再展開毙沾。咱們繼續(xù)深入討論兩階段鎖協(xié)議骗卜。

兩階段鎖協(xié)議(2PL)

官方定義:

兩階段鎖協(xié)議是指所有事務必須分兩個階段對數(shù)據(jù)加鎖和解鎖,在對任何數(shù)據(jù)進行讀、寫操作之前寇仓,事務首先要獲得對該數(shù)據(jù)的封鎖举户;在釋放一個封鎖之后,事務不再申請和獲得任何其他封鎖遍烦。

對應到 MySQL 上分為兩個階段:

  1. 擴展階段(事務開始后俭嘁,commit 之前):獲取鎖
  2. 收縮階段(commit 之后):釋放鎖

就是說呢,只有遵循兩段鎖協(xié)議服猪,才能實現(xiàn) 可串行化調(diào)度供填。

但是兩階段鎖協(xié)議不要求事務必須一次將所有需要使用的數(shù)據(jù)加鎖,并且在加鎖階段沒有順序要求罢猪,所以這種并發(fā)控制方式會形成死鎖近她。

三、MySQL 如何處理死鎖膳帕?

MySQL有兩種死鎖處理方式:

  1. 等待粘捎,直到超時(innodb_lock_wait_timeout=50s)。
  2. 發(fā)起死鎖檢測危彩,主動回滾一條事務攒磨,讓其他事務繼續(xù)執(zhí)行(innodb_deadlock_detect=on)。

由于性能原因汤徽,一般都是使用死鎖檢測來進行處理死鎖娩缰。

死鎖檢測

死鎖檢測的原理是構建一個以事務為頂點、鎖為邊的有向圖谒府,判斷有向圖是否存在環(huán)漆羔,存在即有死鎖。

回滾

檢測到死鎖之后狱掂,選擇插入更新或者刪除的行數(shù)最少的事務回滾演痒,基于 INFORMATION_SCHEMA.INNODB_TRX 表中的 trx_weight 字段來判斷。

四趋惨、如何避免發(fā)生死鎖

收集死鎖信息:

  1. 利用命令 SHOW ENGINE INNODB STATUS查看死鎖原因鸟顺。
  2. 調(diào)試階段開啟 innodb_print_all_deadlocks,收集所有死鎖日志器虾。

減少死鎖:

  1. 使用事務讯嫂,不使用 lock tables
  2. 保證沒有長事務兆沙。
  3. 操作完之后立即提交事務欧芽,特別是在交互式命令行中。
  4. 如果在用 (SELECT ... FOR UPDATE or SELECT ... LOCK IN SHARE MODE)葛圃,嘗試降低隔離級別千扔。
  5. 修改多個表或者多個行的時候憎妙,將修改的順序保持一致
  6. 創(chuàng)建索引曲楚,可以使創(chuàng)建的鎖更少厘唾。
  7. 最好不要用 (SELECT ... FOR UPDATE or SELECT ... LOCK IN SHARE MODE)
  8. 如果上述都無法解決問題龙誊,那么嘗試使用 lock tables t1, t2, t3 鎖多張表

引用(本文章只供本人學習以及學習的記錄抚垃,如有侵權,請聯(lián)系我刪除)

MySQL如何處理死鎖

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末趟大,一起剝皮案震驚了整個濱河市鹤树,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌逊朽,老刑警劉巖魂迄,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異惋耙,居然都是意外死亡捣炬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門绽榛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來湿酸,“玉大人,你說我怎么就攤上這事灭美⊥评#” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵届腐,是天一觀的道長铁坎。 經(jīng)常有香客問我,道長犁苏,這世上最難降的妖魔是什么硬萍? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮围详,結果婚禮上朴乖,老公的妹妹穿的比我還像新娘。我一直安慰自己助赞,他們只是感情好买羞,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著雹食,像睡著了一般畜普。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上群叶,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天吃挑,我揣著相機與錄音钝荡,去河邊找鬼。 笑死儒鹿,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的几晤。 我是一名探鬼主播约炎,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蟹瘾!你這毒婦竟也來了圾浅?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤憾朴,失蹤者是張志新(化名)和其女友劉穎狸捕,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體众雷,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡灸拍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了砾省。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸡岗。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖编兄,靈堂內(nèi)的尸體忽然破棺而出轩性,到底是詐尸還是另有隱情,我是刑警寧澤狠鸳,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布揣苏,位于F島的核電站,受9級特大地震影響件舵,放射性物質發(fā)生泄漏。R本人自食惡果不足惜铅祸,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望个少。 院中可真熱鬧洪乍,春花似錦夜焦、人聲如沸壳澳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至锉屈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間垮耳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工终佛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留俊嗽,地道東北人铃彰。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像牙捉,于是被迫代替她去往敵國和親竹揍。 傳聞我的和親對象是個殘疾皇子邪铲,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一.問題背景 1.什么是死鎖(Deadlock) 摘抄網(wǎng)上死鎖的定義:是指兩個或兩個以上的進程在執(zhí)行過程中,因爭奪...
    dynemm閱讀 3,598評論 1 1
  • 一霜浴、什么是死鎖 二晶衷、為什么會形成死鎖 鎖是需要事務結束后才釋放的。 三阴孟、MySQL 的并發(fā)控制方式 一個是 MVC...
    ScoTing閱讀 1,562評論 0 1
  • 使用mysql數(shù)據(jù)庫晌纫,在并發(fā)加鎖的時候不注意,如鎖A和鎖B永丝,出現(xiàn)鎖A等待鎖B锹漱,鎖B又等待鎖A的情況,這個時候會引發(fā)...
    firefly_閱讀 356評論 0 0
  • 本系列文章主要是本人在游戲服務端開發(fā)過程中慕嚷,遇到的一些不那么為人熟知但我又覺得比較重要的MySQL知識的介紹哥牍。希望...
    higher2017閱讀 337評論 0 0
  • 基礎架構:一條 SQL 查詢語句是如何執(zhí)行的? MySQL 的基本架構示意圖: MySQL 可以分為 Server...
    AI喬治閱讀 3,180評論 7 79