MySQLTransactionRollbackException

問題描述

mysql部署1主3從,昨天發現主庫有大量報警錯誤:

Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
; Deadlock found when trying to get lock; try restarting transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction

定位根因

MySQLTransactionRollbackException是MySQL 處理并發事務時的典型錯誤。一般有死鎖Deadlock和鎖等待超時innodb_lock_wait_timeout兩種;

當兩個或多個事務相互等待對方持有的鎖資源時,MySQL 會主動終止其中一個事務以打破僵局,從而拋出該異常,這一過程由 InnoDB 的死鎖檢測機制自動完成,無需人工干預。

分析死鎖日志,定位沖突點:MySQL 會記錄死鎖詳情到錯誤日志中,可通過以下命令查看最近一次死鎖信息:

SHOW ENGINE INNODB STATUS;

在輸出的?LATEST DETECTED DEADLOCK?部分,能看到:

  • 參與死鎖的事務 ID 和 SQL 語句。
  • 事務持有和等待的鎖類型(如?X-lock?排他鎖)。
  • 涉及的表和行記錄(通過?space id?和?page no?定位)。
    LATEST DETECTED DEADLOCK
    ------------------------
    2025-09-11 17:19:22 0x7ee2dbbdf700
    *** (1) TRANSACTION:
    TRANSACTION 922499728, ACTIVE 0 sec starting index read
    mysql tables in use 1, locked 1
    LOCK WAIT 2 lock struct(s), heap size 1136, 1 row lock(s)
    MySQL thread id 24349657, OS thread handle 139512913655552, query id 4391620199 10.199.99.99 kms_mpmanage_st_pjab updating
    /*id:3b7f6356*//*ip=10.199.99.99*/update srunningset report_time = 1757582355865,is_del = 0,graph_version = null,service_item = ‘aaaaa’,build_id = 9652,report_version = 2,config_version = 'config-202508112023',scene_sdk_version = '1.3.20',table_sdk_version = '2.4.31'where pid = 179529542 and report_time < 1757582355865
    *** (1) WAITING FOR THIS LOCK TO BE GRANTED:
    RECORD LOCKS space id 828 page no 8 n bits 200 index uniq_ip_app_scene_s of table `camp`.`srunning` trx id 922499728 lock_mode X locks rec but not gap waiting
    *** (2) TRANSACTION:
    TRANSACTION 922499723, ACTIVE 0 sec fetching rows
    mysql tables in use 1, locked 1
    27 lock struct(s), heap size 3520, 35 row lock(s), undo log entries 12
    MySQL thread id 24348682, OS thread handle 139512814368512, query id 4391620202 10.199.99.99 kms_mpmanage_st_pjab updating
    /*id:389d6f54*//*ip=10.199.99.99*/update srunningSET report_time = 1757582353855, is_del = 1 WHERE ( pid = 179529542 and report_time < 1757582353855 )
    *** (2) HOLDS THE LOCK(S):
    RECORD LOCKS space id 828 page no 8 n bits 200 index uniq_ip_app_scene_s of table `camp`.`srunning` trx id 922499723 lock_mode X locks rec but not gap
    *** (2) WAITING FOR THIS LOCK TO BE GRANTED:
    RECORD LOCKS space id 828 page no 8 n bits 200 index uniq_ip_app_scene_s of table `camp`.`srunning` trx id 922499723 lock_mode X waiting
    *** WE ROLL BACK TRANSACTION (1)

    兩個update更新同一表死鎖是兩個事務在該表中以不同順序獲取行鎖,形成循環等待。

    解決和避免

    業務涉及事務的4個表都達到了500W+,且事務內同時查詢插入或更新4個表,所以多次死鎖

    統一事務操作順序

    多個事務更新同一批行時,按相反或不同的順序執行?UPDATE,是單表死鎖的最主要原因。

    降低鎖粒度或使用合理的索引

    使用非主鍵索引、范圍條件(>,?<,?BETWEEN)等,導致 InnoDB 加鎖范圍擴大(如間隙鎖、臨鍵鎖),增加交叉等待概率。

    縮小事務范圍減少鎖持有時間

    事務執行時間過長,長時間占用鎖資源,提高了與其他事務形成循環等待的可能性。

    數據表量級對性能有顯著影響

    • 小型表(10 萬行以內)SELECT、INSERT、UPDATE基本無瓶頸,操作耗時主要受 SQL 語句寫法影響
    • 中型表(10 萬~1000 萬行):SELECT無索引的全表掃描開始變慢,有索引但索引設計不合理(如低基數索引)時,性能下降明顯,復雜查詢(多表關聯、子查詢)耗時增加,可能出現臨時表或文件排序。INSERT:單條插入影響不大,但批量插入可能因索引維護(如 B+ 樹分裂)耗時增加。若表有多個索引,寫入性能下降更明顯(每個索引都需更新)。UPDATE:基于非索引字段的更新需要全表掃描,耗時顯著增加。高頻更新可能導致行鎖 / 表鎖競爭,出現等待延遲。
    • 大型表(1000 萬~1 億行):需要分庫分表、數據歸檔等拆分

    代碼層面捕獲異常并重試

    死鎖是臨時性異常,重試通常可解決。在代碼中捕獲?MySQLTransactionRollbackException,并設置合理的重試機制

    鎖類型

    • lock_type:鎖類型,常見值:
      • RECORD:行級鎖(針對具體行記錄)。
      • TABLE:表級鎖(針對整個表)。
    • lock_mode:鎖模式,常見值:
      • S:共享鎖(讀鎖,允許其他事務讀,不允許寫)。
      • X:排他鎖(寫鎖,禁止其他事務讀和寫)。
      • GAP:間隙鎖(鎖定索引間隙,防止插入數據)。
      • Next-Key:臨鍵鎖(行鎖 + 間隙鎖的組合,默認的行鎖模式)。

    行級排他鎖,UPDATE/DELETE/INSERT?時自動加鎖,阻止其他事務修改該行。

    行級共享鎖,SELECT ... FOR SHARE?顯式加鎖,允許其他事務讀,但阻止寫。

    排他間隙鎖,鎖定索引間隙,防止其他事務插入數據(如?UPDATE ... WHERE id > 10?可能觸發)。

    臨鍵鎖(默認行鎖模式),鎖定行及前面的間隙,防止幻讀(REPEATABLE READ?隔離級別下默認)。

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/news/922128.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/news/922128.shtml
    英文地址,請注明出處:http://en.pswp.cn/news/922128.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    Redis環境搭建指南:Windows/Linux/Docker多場景安裝與配置

    Redis環境搭建指南&#xff1a;Windows/Linux/Docker多場景安裝與配置 1. Redis安裝方式概覽 1.1 安裝方式對比 安裝方式適用場景優點缺點難度Windows直接安裝開發調試安裝簡單&#xff0c;Windows兼容好性能不如Linux&#xff0c;生產不推薦?Linux源碼編譯生產環境性能最佳…

    leetcode.80刪除有序數組中的重復項2

    題目描述 給你一個有序數組 nums &#xff0c;請你 原地 刪除重復出現的元素&#xff0c;使得出現次數超過兩次的元素只出現兩次 &#xff0c;返回刪除后數組的新長度。 不要使用額外的數組空間&#xff0c;你必須在 原地 修改輸入數組 并在使用 O(1) 額外空間的條件下完成。…

    運動卡新手入門及常見問題處理

    1.新手入門1.1 插卡打開包裝&#xff0c;拿出PCI板卡&#xff0c;如下圖&#xff1a;打開電腦機箱蓋&#xff0c;找到PCI插槽&#xff0c;如下圖&#xff08;紅色框部分是PCI槽&#xff0c;有些主板上PCI槽是白色或其他顏色&#xff09;&#xff1a;插入板卡&#xff0c;如下圖…

    PRINCE2與PMP項目管理體系對比

    在全球范圍內&#xff0c;PRINCE2與PMP是兩大最具影響力的項目管理體系。PRINCE2注重流程和治理結構&#xff0c;強調“控制”與“規范”&#xff1b;而PMP基于PMBOK指南&#xff0c;強調知識體系和方法論的全面性&#xff0c;更關注“工具”與“實踐”。 不同體系的側重點&…

    在UniApp跨平臺開發中實現相機自定義濾鏡的鏈式處理架構

    以下是進階方案&#xff1a;架構核心設計分層結構$$Pipeline Capture \otimes Filter_1 \otimes Filter_2 \otimes \cdots \otimes Filter_n \otimes Render$$ 其中&#xff1a;$\otimes$ 表示鏈式處理操作符$Capture$ 為原始圖像采集層$Filter_n$ 為可插拔濾鏡單元$Render$ 為…

    Mark5 穿越機電調深度解析:設計、選型、控制與實戰(下)

    TIM_SetCompare3 (TIM1, T0 + T1 + T2); // W+? break;? case 3:? // U - 導通,V - 導通,W + 導通? TIM_SetCompare1 (TIM1, T0); // U-? TIM_SetCompare2 (TIM1, T0); // V-? TIM_SetCompare3 (TIM1, T0 + T1 + T2); // W+? break;? case 4:? // U - 導通…

    背包問題從入門到入土

    我在這里介紹4種常見的背包問題&#xff0c;這里我想按易 --> 難程度從01背包&#xff0c;完全背包&#xff0c;分組背包&#xff0c;多重背包的順序介紹。&#xff08;封面附在最后&#xff09;一&#xff0c;01背包問題&#xff08;后面三個背包問題的基礎&#xff09;01背…

    Leetcode 18 java

    ?????1???????141. 環形鏈表1 題目 ?????1???????141. 環形鏈表 給你一個鏈表的頭節點 head &#xff0c;判斷鏈表中是否有環。 如果鏈表中有某個節點&#xff0c;可以通過連續跟蹤 next 指針再次到達&#xff0c;則鏈表中存在環。 為了表示給定鏈表…

    Linux 正則表達式詳解(基礎 + 擴展 + 實操)

    Linux 正則表達式詳解&#xff08;基礎 擴展 實操&#xff09; 正則表達式&#xff08;Regular Expression&#xff0c;簡稱 RE&#xff09;是 Linux 文本處理的核心工具&#xff0c;用于定義字符匹配模式&#xff0c;配合 grep、sed、awk 等工具可實現文本過濾、查找、替換等…

    Json-rpc通信項目(基于C++ Jsoncpp muduo庫)

    一、介紹RPC RPC&#xff08;Remote Procedure Call&#xff09;遠程過程調用&#xff0c;一種通過網絡從遠程計算器上請求服務&#xff0c;而不需要了解底層網絡通信細節&#xff0c;RPC可以使用多種網絡協議進行通信&#xff0c;并且在TCP/IP網絡四層模型中跨越了傳輸層和應…

    RL【9】:Policy Gradient

    系列文章目錄 Fundamental Tools RL【1】&#xff1a;Basic Concepts RL【2】&#xff1a;Bellman Equation RL【3】&#xff1a;Bellman Optimality Equation Algorithm RL【4】&#xff1a;Value Iteration and Policy Iteration RL【5】&#xff1a;Monte Carlo Learnin…

    Redis是什么?一篇講透它的定位、特點與應用場景

    Redis是什么&#xff1f;一篇講透它的定位、特點與應用場景 1. Redis的定義與核心概念 1.1 什么是Redis&#xff1f; Redis&#xff08;Remote Dictionary Server&#xff09; 是一個開源的、基于內存的數據結構存儲系統&#xff0c;可以用作數據庫、緩存和消息代理。Redis由…

    一款免費開源輕量的漏洞情報系統 | 漏洞情報包含:組件漏洞 + 軟件漏洞 + 系統漏洞

    工具介紹 bug_search一款免費開源輕量的漏洞情報系統 基于python3 Amis2.9 開發&#xff0c;僅依賴Flask,requests&#xff0c;無需數據庫&#xff0c;Amis是百度開源的低代碼前端框架漏洞情報包含&#xff1a;組件漏洞 軟件漏洞 系統漏洞 增加郵件發送消息報警功能增加釘釘…

    詳解在Windows系統中生成ssl證書,實現nginx配置https的方法

    目錄一、下載安裝OpenSSL二、證書生成三、修改nginx配置總結Nginx 是一個高性能的HTTP和反向代理web服務器&#xff0c;在進行web項目開發時&#xff0c;大多都是使用nginx對外提供web服務。HTTPS &#xff08;全稱&#xff1a;Hypertext Transfer Protocol Secure [5]&#xf…

    AI視覺算法中的OpenCV API (二)

    視頻寫入 (FourCC, VideoWriter)? 1. VideoWriter_fourcc - 視頻編碼器四字符代碼 # OpenCV 3.x, 4.x fourcc cv2.VideoWriter_fourcc(M,J,P,G)fourcc cv2.VideoWriter_fourcc(*H264)fourcc cv2.VideoWriter_fourcc(*MJPG) ?FourCC?&#xff1a; 代表 ?Four ?Charac…

    分享| 2025年版AIGC數字人實驗室解決方案教學資源解析

    AIGC數字人實驗室解決方案構建了涵蓋基礎層、平臺環境層與資源層的多層次教學架構&#xff0c;依托150平方米的實體空間與60人并行授課的規模化支持&#xff0c;為學生提供了技術實踐與創新的高效平臺。其教學資源體系覆蓋AIGC文本生成、圖像生成、數字人應用與智能體開發四大核…

    內存大(巨)頁

    一、大&#xff08;巨&#xff09;頁 大&#xff08;巨&#xff09;頁&#xff0c;很好理解&#xff0c;就是的大的頁。說這個大頁前&#xff0c;得先把計算機中內存的管理簡單說明一下&#xff0c;否則可能對于一些新手或者把操作系統中內存管理的方法的開發者不太友好。最早的…

    langgraph astream使用詳解

    langgraph中graph的astream&#xff08;stream&#xff09;方法分別實現異步&#xff08;同步&#xff09;流式應答&#xff0c;在langgraph-api服務也是核心方法&#xff0c;實現與前端的對接&#xff0c;必須要把這個方法弄明白。該方法中最重要的參數是stream_mode&#xff…

    【C++】模板進階:非類型參數、模板特化與分離編譯

    目錄 1. 非類型模板參數 2. 模板的特化 3. 分離編譯 1. 非類型模板參數 模板參數分類類型形參與非類型形參。 類型形參即&#xff1a;出現在模板參數列表中&#xff0c;跟在class或者typename之類的參數類型名稱。 非類型形參&#xff0c;就是用一個常量作為類(函數)模板…

    棧-1047.刪除字符串中的所有相鄰重復項-力扣(LeetCode)

    一、題目解析 1、反復執行重復項刪除操作 2、s僅由小寫英文字母組成 二、算法原理 該題并不難&#xff0c;難的是能不能想到用棧這個數據結構解題 解法&#xff1a;棧模擬 橫著看起來不好理解&#xff0c;我們把它豎起來&#xff0c;是不是和消消樂很類似&#xff0c;兩兩消…