最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL已產(chǎn)生死鎖的解決方法及永久避免方案

 更新時間:2026年06月03日 09:37:26   作者:碼不停蹄的玄黓  
這段文章介紹了MySQL死鎖的處理與預防策略,涵蓋了自動自動處理、查看死鎖日志、臨時應急措施以及永久避免死鎖的方法,通過優(yōu)化事務邏輯、固定訪問順序和加索索引等措施,可以有效減少死鎖的發(fā)生,需要的朋友可以參考下

引言

死鎖是多個事務互相持有對方需要的鎖,且都不釋放,導致互相無限等待的現(xiàn)象,MySQL 會自動檢測并終止其中一個事務(拋出死鎖異常),讓另一個正常執(zhí)行。

你現(xiàn)在的核心需求分兩步:

  1. 緊急處理:已經(jīng)發(fā)生死鎖,怎么快速恢復業(yè)務?
  2. 根治問題:怎么讓死鎖不再頻繁出現(xiàn)?

一、已經(jīng)產(chǎn)生死鎖:3步快速解決

1. 無需手動殺進程!MySQL 會自動處理

MySQL 內置死鎖檢測(默認開啟),一旦檢測到死鎖:

  • 立即回滾代價最小的那個事務
  • 給應用拋出 Deadlock found when trying to get lock; try restarting transaction 異常
  • 另一個事務會自動繼續(xù)執(zhí)行,死鎖瞬間解除

結論已發(fā)生的死鎖不需要人工干預,MySQL 自己會秒級解決。

2. 查看死鎖日志:找到根源(最重要)

死鎖已經(jīng)發(fā)生,必須查日志定位原因,執(zhí)行命令:

-- 查看最近一次死鎖的詳細信息
SHOW ENGINE INNODB STATUS;

在結果中找到 LATEST DETECTED DEADLOCK 段落,里面會告訴你:

  • 哪兩個事務死鎖了
  • 各自執(zhí)行的 SQL
  • 各自持有什么鎖、等待什么鎖
  • 死鎖發(fā)生的時間

這是解決死鎖的唯一依據(jù)。

3. 臨時應急:卡住的事務不自動解除?

極少數(shù)情況(關閉了死鎖檢測),事務會一直卡住,執(zhí)行以下命令手動處理:

-- 1. 查看正在運行的事務,找到卡住的 ID
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

-- 2. 殺掉卡住的事務
KILL 事務ID;

二、永久避免死鎖:4個核心方案(必做)

死鎖無法100%杜絕,但99%的死鎖都能通過規(guī)范避免。

1. 事務保持短小,不要長事務

  • 死鎖概率和事務執(zhí)行時間成正比
  • 禁止在事務里嵌套:網(wǎng)絡請求、文件IO、人工操作、sleep
  • 原則:快進快出,執(zhí)行完立即提交/回滾

壞例子

BEGIN;
UPDATE 表 SET ...;
-- 這里調用了外部接口,耗時3秒,鎖一直持有,極易死鎖
COMMIT;

2. 所有表固定訪問順序(最有效)

死鎖的本質:訪問順序相反

  • 事務A:先鎖訂單 → 再鎖庫存
  • 事務B:先鎖庫存 → 再鎖訂單
    → 瞬間死鎖

解決方案:
所有業(yè)務代碼,必須按相同順序操作表/行
例如:統(tǒng)一先操作庫存,再操作訂單。

3. 給查詢條件加索引

無索引會導致行鎖升級為表鎖,死鎖概率暴增。

-- 錯誤:無索引,會鎖全表
UPDATE user SET money=100 WHERE name='張三'; 

-- 正確:name 有索引,只鎖單行
UPDATE user SET money=100 WHERE name='張三'; 

死鎖日志里如果看到 LOCK_MODE: X, REC_NOT_GAP: nil 基本就是無索引導致。

4. 業(yè)務代碼捕獲死鎖異常,自動重試

死鎖是偶發(fā)異常,重試就能成功,這是兜底方案。

Java 示例:

try {
    // 執(zhí)行數(shù)據(jù)庫操作
} catch (SQLTransactionRollbackException e) {
    if (e.getMessage().contains("Deadlock")) {
        // 死鎖異常,重試1-2次
        retry();
    }
}

三、快速排查死鎖 Checklist

  1. 執(zhí)行 SHOW ENGINE INNODB STATUS; 看死鎖詳情
  2. 檢查兩個事務是否訪問表/行順序相反
  3. 檢查更新語句是否沒有索引
  4. 檢查是否有長事務
  5. 業(yè)務代碼是否沒有重試機制

總結

  1. 已產(chǎn)生的死鎖:MySQL 自動回滾一個事務,無需手動處理
  2. 查死鎖原因:用 SHOW ENGINE INNODB STATUS;
  3. 根治死鎖:固定訪問順序 + 加索引 + 短事務 + 代碼重試
  4. 兜底:業(yè)務捕獲死鎖異常自動重試,用戶無感知

到此這篇關于MySQL已產(chǎn)生死鎖的解決方法及永久避免方案的文章就介紹到這了,更多相關MySQL已產(chǎn)生死鎖解決與避免內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Linux下指定mysql數(shù)據(jù)庫數(shù)據(jù)配置主主同步的實例

    Linux下指定mysql數(shù)據(jù)庫數(shù)據(jù)配置主主同步的實例

    Linux下指定數(shù)據(jù)庫數(shù)據(jù)配置主主同步的實例,有需要的朋友可以參考下
    2013-01-01
  • mysql日志文件之undo?log和redo?log

    mysql日志文件之undo?log和redo?log

    MySQL日志記錄了MySQL數(shù)據(jù)庫日常操作和錯誤信息,MySQL有不同類型的日志文件,下面這篇文章主要給大家介紹了關于mysql日志文件之undo?log和redo?log的相關資料,需要的朋友可以參考下
    2022-04-04
  • MySql用DATE_FORMAT截取DateTime字段的日期值

    MySql用DATE_FORMAT截取DateTime字段的日期值

    MySql截取DateTime字段的日期值可以使用DATE_FORMAT來格式化,使用方法如下
    2014-08-08
  • MySQL外鍵約束的刪除和更新總結

    MySQL外鍵約束的刪除和更新總結

    這篇文章主要給大家總結MySQL外鍵約束的刪除和更新,文中通過代碼示例和圖文介紹的非常詳細,對大家了解MySQL外鍵約束有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • MySQL中有哪些情況下數(shù)據(jù)庫索引會失效詳析

    MySQL中有哪些情況下數(shù)據(jù)庫索引會失效詳析

    這篇文章主要給大家介紹了關于MySQL中有哪些情況下數(shù)據(jù)庫索引會失效的相關資料,文中通過圖文介紹的非常詳細,對大家學習或者使用mysql具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-07-07
  • Mysql使用索引的正確方法及索引原理詳解

    Mysql使用索引的正確方法及索引原理詳解

    這篇文章主要給大家介紹了關于Mysql使用索引的正確方法及索引原理的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用mysql具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-05-05
  • MySQL之join查詢優(yōu)化方式

    MySQL之join查詢優(yōu)化方式

    這篇文章主要介紹了MySQL之join查詢優(yōu)化方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 使用MySQL Workbench構建ER圖的詳細教程

    使用MySQL Workbench構建ER圖的詳細教程

    ER圖又稱實體-聯(lián)系圖(Entity Relationship Diagram),提供了表示實體類型、屬性和聯(lián)系的方法,用來描述現(xiàn)實世界的概念模型,MySQL?Workbench是一個強大的數(shù)據(jù)庫設計工具,提供了便捷的數(shù)據(jù)導入導出功能,本文介紹了使用MySQL Workbench構建ER圖的詳細教程
    2024-06-06
  • 淺談MySql 視圖、觸發(fā)器以及存儲過程

    淺談MySql 視圖、觸發(fā)器以及存儲過程

    這篇文章主要介紹了MySql 視圖、觸發(fā)器以及存儲過程的的相關資料,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-06-06
  • MySQL可以使用斜線來當字段的名字

    MySQL可以使用斜線來當字段的名字

    無意中發(fā)現(xiàn)MySQL可以使用斜線來當字段的名字,下面有個示例,需要的朋友可以參考下
    2014-03-03

最新評論

金昌市| 肇庆市| 台江县| 苏州市| 舒城县| 休宁县| 海林市| 河池市| 永登县| 马山县| 曲水县| 宜良县| 安义县| 额尔古纳市| 镇原县| 平谷区| 百色市| 崇州市| 鹤峰县| 商河县| 广宗县| 外汇| 白玉县| 响水县| 通渭县| 安福县| 刚察县| 雷山县| 鸡泽县| 神农架林区| 清河县| 旌德县| 大英县| 将乐县| 班戈县| 深泽县| 张家界市| 怀宁县| 万山特区| 霍林郭勒市| 沙洋县|