婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > MySQL線上死鎖分析實戰

MySQL線上死鎖分析實戰

熱門標簽:電話外呼系統改號 地圖標注費用是多少 怎樣在地圖標注銷售區域 外呼系統打電話上限是多少 南昌三維地圖標注 百應電話機器人優勢 啥是企業400電話辦理 曲靖移動外呼系統公司 武漢網絡外呼系統服務商

前言

MySQL 的鎖機制相信大家在學習 MySQL 的時候都有簡單的了解過,那既然有鎖就必定繞不開死鎖這個問題。其實 MySQL 在大部分場景下是不會存在死鎖問題的(比如并發量不高,SQL 寫得不至于太拉胯的情況),但是在高并發的業務場景下,一不注意就會產生死鎖,而這個死鎖分析起來也比較麻煩。

前段時間在公司實習的時候就遇到了一個比較奇怪的死鎖,之前一直沒來得及好好整理,最近有空復現了一下,算是積累一點經驗。

業務場景

簡單說一下業務背景,公司做的是電商直播,我負責的是主播端相關的業務。而這個死鎖就出現在主播后臺對商品信息進行更新的時候。

我們的一個商品會有兩個關聯的 ID,通過其中任何一個 ID 都無法確定唯一一件商品(也就是說這個 ID 和商品是一對多的關系),只能同時查詢兩個 ID,才能確定一件商品。所以在更新商品信息的時候,需要在 where 條件中同時指定兩個 ID,下面是死鎖 SQL 的結構(已脫敏):

UPDATE test_table SET `name`="zhangsan" WHERE class_id = 10 AND teacher_id = 8;

這個 SQL 非常簡單,根據兩個等值條件,對一個字段進行更新。

不知道你看到這個 SQL 會不會懵逼,按常理來說,應該是一個事務里有多條 SQL 才會有可能出現死鎖,這一條 SQL 怎么可能出現死鎖呢?

是的,我當時也有這樣的疑惑,甚至懷疑是不是報警系統瞎報(最后證明不是…),當時是真的摸不著頭腦。并且因為數據庫權限的原因,想看死鎖日志都看不到,又是臨近下班的時候,找 DBA 能麻煩死,所以就直接搜索引擎走起了……(關鍵詞:update 死鎖 單條 sql),最后查出來是由于 MySQL 的索引合并優化導致的,即 Index Merge,下面會進行詳細講解并復現一下死鎖場景。

索引合并

Index Merge 是 MySQL 在 5.0 的時候引入的一項優化功能,主要是用于優化一條 SQL 使用多個索引的情況。

我們來看剛剛的 SQL,假設 class_idteacher_id 分別是兩個普通索引:

UPDATE test_table SET `name`="zhangsan" WHERE class_id = 10 AND teacher_id = 8;

如果沒有 Index Merge 優化的時候,MySQL 查詢數據的步驟如下:

  • 根據 class_id 或 teacher_id (具體使用哪個索引由優化器根據實際數據情況自行判斷,這里假設使用 class_id的索引)在二級索引上查詢到對應數據的主鍵 ID
  • 根據查詢到的主鍵 ID 進行回標查詢(即查詢聚簇索引),得到相應的數據行
  • 從數據行中獲取 teacher_id ,判斷其是否等于 8,滿足條件則返回

從這個過程中,不難看出,MySQL 只使用到了一個索引,至于為什么不使用多個索引,簡單來說就是因為多個索引在多棵樹上,強行使用反而降低性能。

再來看看引入了 Index Merge 優化后,MySQL 查詢數據的步驟如下:

  • 根據 class_id 查詢到相應的主鍵,再根據主鍵回表查詢到對應的數據行(記為結果集 A)
  • 根據 teacher_id 查詢到相應的主鍵,再根據主鍵回表查詢到對應的數據行(記為結果集 B)
  • 將結果集 A 和結果集 B 執行交集操作,獲得最終滿足條件的結果集

這里可以看出,有了 Index Merge 之后,MySQL 將一條 SQL 語句拆分成了兩個查詢步驟,分別使用兩個索引,再用交集操作優化性能。

死鎖分析

分析完了 Index Merge 的步驟,我們再回過頭想一下為什么會出現死鎖呢?

還記得上面說的 Index Merge 將一條 SQL 查詢拆分成了兩個步驟嗎,問題就出現在這里。我們知道 UPDATE 語句是會加上一個行級排他鎖的,在分析加鎖步驟之前,我們假設有如下一個數據表:

上表數據滿足我們文章開頭說的特點,根據 class_idteacher_id 單個字段均無法唯一確定一條數據,只能聯合兩個字段,才能確定一條數據,并且設定 class_idteacher_id 分別為兩個普通索引。

假設有如下兩條 SQL 語句并發執行,它們的參數完全不同,直覺告訴我們應該不會出現死鎖,但直覺往往是錯誤的:

// 線程 A 執行
UPDATE test_table SET `name`="zhangsan" WHERE class_id = 2 AND teacher_id = 1;

// 線程 B 執行
UPDATE test_table SET `name`="zhangsan" WHERE class_id = 1 AND teacher_id = 2;

那么在 Index Merge 的優化下,并發執行如上 SQL 的時候,MySQL 的加鎖步驟如下:

最終,兩個事務互相等待,形成死鎖

解決方案

因為這個死鎖本質上還是由于 Index Merge 這個優化導致的,所以要解決這個場景的死鎖問題,本質上只要讓 MySQL 不走 Index Merge 優化即可。

方案一

手動將一條 SQL 拆分成多條 SQL,在邏輯層做交集操作,阻止 MySQL 的憨憨優化行為,比如這里我們可以先根據 class_id 查詢到相應主鍵,再根據 teacher_id 查詢相應主鍵,最后根據交集后的主鍵查詢數據。

方案二

建立聯合索引,比如這里可以將 class_idteacher_id 建立一個聯合索引,MySQL 就不會走 Index Merge 了

方案三

強制走單個索引,在表名后添加 for index(class_id) 可以指定該語句僅走 class_id 索引

方案四

關閉 Index Merge 優化:

  • 永久關閉:SET [GLOBAL|SESSION] optimizer_switch='index_merge=off';
  • 臨時關閉:UPDATE /*+ NO_INDEX_MERGE(test_table) */ test_table SET name="zhangsan" WHERE class_id = 10 AND teacher_id = 8;

場景復現

數據準備

為了方便測試,這里提供一個 SQL 腳本,將其用 Navicat 導入后即可得到需要的測試數據:

下載地址:https://cdn.juzibiji.top/file/index_merge_student.sql

導入之后,我們會得到如下格式的 10000 條測試數據:

測試代碼

由于篇幅限制,這里僅給出代碼 Gist 鏈接:https://gist.github.com/juzi214032/17c0f7a51bd8d1c0ab39fa203f930c60

上述代碼主要是開啟 100 個線程執行我們的數據修改 SQL 語句,來模擬線上并發情況,在運行幾秒鐘后,我們會得到下面這樣一個報錯:

com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction

這代表已經產生了死鎖異常

死鎖分析

上面我們用代碼已經構造出了一個死鎖,接下來我們進入 MySQL 看看死鎖日志,在 MySQL 中執行如下命令即可查看死鎖日志:

SHOW ENGINE INNODB STATUS;

在日志中,我們找到 LATEST DETECTED DEADLOCK 這一行,這里開始便是我們上次產生的死鎖,接下來我們開始分析。

通過第 29 行可以看到,事務 1 執行的 SQL 的條件是 class_id = 6teacher_id = 16 ,它目前持有了一個行鎖,第 34~39 行是該行數據,34 行是主鍵的十六進制表示,我們轉換為 10 進制即為 1616。同樣的,看 45 行,其等待拿鎖的是主鍵 id 1517 的數據。

接下來用同樣的方法分析事務 2,可知事務 2 持有了 3 把鎖,分別是主鍵 id 為1317、1417、1517 的數據行,等待的是 1616 。

看到這里我們就已經發現了,事務 1 持有 1616 等待 1517,事務 2 持有1517 等待 1616,所以形成了一個死鎖。此時 MySQL 的處理方法是回滾持有鎖最少的事務,并且 JDBC 會拋出我們前面的 MySQLTransactionRollbackException 回滾異常。

總結

這個死鎖在排查的時候其實非常不好排查,如果你不知道 MySQL 的 Index Merge,那么在排查的時候其實是毫無頭緒的,因為呈現在你面前的就只有一條非常簡單的 SQL,就算看死鎖日志,也是一樣的不明所以。

所以處理這類問題,更多的還是考驗你的知識儲備量和經驗,只要遇到過一次,后面在寫 SQL 的時候多加注意就好了!

到此這篇關于MySQL線上死鎖分析實戰的文章就介紹到這了,更多相關MySQL線上死鎖分析內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Mysql查詢正在執行的事務以及等待鎖的操作方式
  • mysql查看死鎖與去除死鎖示例詳解
  • Mysql查看死鎖與解除死鎖的深入講解
  • MySQL死鎖檢查處理的正常方法
  • MySQL死鎖的產生原因以及解決方案
  • MySQL死鎖套路之唯一索引下批量插入順序不一致
  • 由不同的索引更新解決MySQL死鎖套路
  • 通過唯一索引S鎖與X鎖來了解MySQL死鎖套路
  • 詳解MySQL(InnoDB)是如何處理死鎖的
  • MySQL鎖等待與死鎖問題分析

標簽:滄州 隨州 資陽 甘南 荊州 吉林 錦州 黑河

巨人網絡通訊聲明:本文標題《MySQL線上死鎖分析實戰》,本文關鍵詞  MySQL,線上,死鎖,分析,實戰,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL線上死鎖分析實戰》相關的同類信息!
  • 本頁收集關于MySQL線上死鎖分析實戰的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产亚洲欧美激情| 欧美性生活影院| 91性感美女视频| 国产精品看片你懂得| 久久er精品视频| 久久精品视频免费| 日韩欧美美女一区二区三区| 在线视频国内自拍亚洲视频| 免费一级片91| 国产日韩欧美一区二区三区乱码| 91丨九色丨黑人外教| 国产精品系列在线| 日韩欧美中文字幕精品| 精品日韩一区二区三区免费视频| 97精品久久久午夜一区二区三区| 国产高清不卡一区| 久久这里只有精品视频网| 亚洲国产欧美一区二区三区丁香婷| 一色屋精品亚洲香蕉网站| 亚洲乱码中文字幕| 国内精品嫩模私拍在线| 91丝袜美腿高跟国产极品老师 | 精品一区二区三区免费视频| 色噜噜久久综合| 国产精品久久99| 激情久久五月天| 国产欧美日韩亚州综合| 在线免费不卡视频| 久久精品久久久精品美女| 一区二区三区鲁丝不卡| 99久久久国产精品免费蜜臀| 国产一区二区三区综合| 欧美午夜影院一区| 日韩视频免费观看高清完整版在线观看| 国产精品国产自产拍高清av | 成人黄色大片在线观看| 亚洲五月六月丁香激情| 国产日韩欧美精品一区| 欧美一级高清片| 日韩欧美一级在线播放| 日韩欧美一二区| 久久精品亚洲乱码伦伦中文| 2023国产一二三区日本精品2022| 7777精品伊人久久久大香线蕉的| 91麻豆国产香蕉久久精品| 99国产欧美另类久久久精品| av午夜精品一区二区三区| 成人精品视频一区二区三区尤物| 精品在线播放免费| 国产高清不卡一区二区| 成人免费看的视频| 欧美专区亚洲专区| 91精品国产综合久久婷婷香蕉| 欧美自拍偷拍午夜视频| 6080日韩午夜伦伦午夜伦| 精品国产伦一区二区三区观看方式 | 欧美日韩精品二区第二页| 91首页免费视频| 欧美疯狂做受xxxx富婆| 国产日韩欧美电影| 一级精品视频在线观看宜春院 | 欧美视频一区二区三区四区| 久久久久99精品一区| 夜夜亚洲天天久久| 久久99国内精品| 欧美性感一类影片在线播放| 久久精品一区蜜桃臀影院| 五月天激情小说综合| 国产成人亚洲精品狼色在线| 欧美女孩性生活视频| 中文字幕日韩一区| 久久99精品国产.久久久久久| 91国偷自产一区二区开放时间| 精品欧美一区二区三区精品久久| 亚洲同性同志一二三专区| 极品瑜伽女神91| 久久先锋影音av| 国内成+人亚洲+欧美+综合在线 | 国内久久精品视频| 91麻豆精品91久久久久同性| 美日韩一区二区三区| 日韩三级视频中文字幕| 日韩不卡免费视频| 精品盗摄一区二区三区| 国产91色综合久久免费分享| 国产日产精品一区| 成人18视频在线播放| 亚洲最大色网站| 日韩一区和二区| 精品一区二区免费在线观看| 欧美三级韩国三级日本三斤| 亚洲国产sm捆绑调教视频 | 日韩av一区二区在线影视| 91麻豆精品久久久久蜜臀| 国产中文一区二区三区| 亚洲男人的天堂在线观看| 欧美色综合久久| 国产v日产∨综合v精品视频| 亚洲人成网站影音先锋播放| 91麻豆精品国产| 成人av资源在线| 久久草av在线| 日韩黄色片在线观看| 亚洲色欲色欲www在线观看| 日韩免费一区二区| 欧美猛男男办公室激情| 91在线看国产| 波多野结衣中文字幕一区二区三区| 亚洲成av人片www| 国产精品美女一区二区三区| 日韩欧美国产系列| 欧美一区二区免费| 欧美色成人综合| 欧美视频你懂的| 欧美日韩国产欧美日美国产精品| 成人h动漫精品| 色综合视频在线观看| 91丨九色porny丨蝌蚪| 国产精品一区二区三区乱码| 开心九九激情九九欧美日韩精美视频电影 | 欧美专区日韩专区| 欧美国产欧美亚州国产日韩mv天天看完整 | 久久99精品久久久| 午夜精品成人在线视频| 紧缚捆绑精品一区二区| 精品国产乱码久久久久久浪潮 | 五月天中文字幕一区二区| 国产成人综合在线播放| 精品国产123| 成人av网址在线| 日本一区中文字幕| 久久久久久夜精品精品免费| 另类小说欧美激情| 久久天堂av综合合色蜜桃网| 日韩欧美一区二区在线视频| 午夜a成v人精品| 99热在这里有精品免费| 天天综合色天天综合色h| 国产免费观看久久| 欧美喷潮久久久xxxxx| 男女男精品网站| 日韩毛片视频在线看| 亚洲成人在线网站| 欧美猛男超大videosgay| 色综合久久久久综合| 亚洲视频精选在线| 91社区在线播放| 亚洲欧美另类小说视频| a4yy欧美一区二区三区| 亚洲人妖av一区二区| 91亚洲大成网污www| 一区二区在线观看视频在线观看| 色婷婷久久99综合精品jk白丝 | 色哦色哦哦色天天综合| 亚洲激情五月婷婷| 欧美一区永久视频免费观看| 黄色日韩网站视频| 久久精品亚洲乱码伦伦中文| av成人老司机| 亚洲一区免费观看| 欧美r级电影在线观看| 国产乱人伦偷精品视频不卡| 中文字幕字幕中文在线中不卡视频| 亚洲一二三四久久| 东方aⅴ免费观看久久av| 日韩视频一区在线观看| 亚洲欧美一区二区久久| 亚洲综合一区二区精品导航| 26uuu久久综合| 久久久亚洲午夜电影| 久久国产精品免费| 91网站在线播放| 中文字幕精品三区| 成人激情综合网站| 亚洲一区在线观看视频| 欧美一区三区四区| 国产呦精品一区二区三区网站| 91精品国产免费| 成人免费毛片高清视频| 亚洲一区二区三区免费视频| 精品国产一区二区三区四区四| 国产91精品露脸国语对白| 图片区小说区区亚洲影院| 欧美激情综合网| 宅男在线国产精品| 久久日韩精品一区二区五区| 国产精品入口麻豆原神| 午夜精品久久久久久久99樱桃| 国产精品乡下勾搭老头1| 欧美一区二区三区系列电影| 亚洲一区免费视频| 91国产免费观看| 天天色图综合网| 日韩一区二区视频在线观看| 亚洲综合激情小说| av成人动漫在线观看| 亚洲欧洲综合另类| av不卡免费在线观看| 一级女性全黄久久生活片免费| 色婷婷一区二区|