日韩欧美国产精品免费一二-日韩欧美国产精品亚洲二区-日韩欧美国产精品专区-日韩欧美国产另-日韩欧美国产免费看-日韩欧美国产免费看清风阁

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

數據庫死鎖場景如何復現和解決?

freeflydom
2025年3月17日 10:32 本文熱度 69

需了解死鎖先看這一篇

死鎖是如何被發現和解決的?這篇文章告訴你

一、死鎖的產生原因

  • 死鎖發生在兩個或多個事務相互等待對方釋放鎖,導致它們都無法繼續執行的情況,形成死鎖。
  • 這種情況在并發高的系統中比較常見,尤其是在多個事務同時操作相同的數據時。

常見場景包括:

  1. 不同順序訪問資源:事務A先操作表1再操作表2,事務B先操作表2再操作表1。
  2. 索引缺失:全表掃描導致鎖范圍擴大,增加沖突概率。
  3. 長事務:事務長時間未提交,導致鎖持有時間過長。

二、死鎖場景復現(以MySQL為例)

  • 復現死鎖可以幫助理解問題發生的條件,從而更好地預防和解決。
1. 準備測試表和數據
CREATE TABLE account (
    id INT PRIMARY KEY,
    balance DECIMAL(10,2)
);
INSERT INTO account VALUES (1, 1000.00), (2, 2000.00);
2. 模擬兩個事務交叉更新
  • 事務A:先更新id=1,再更新id=2。

    BEGIN;
    UPDATE account SET balance = balance - 100 WHERE id = 1;
    -- 等待事務B執行后再繼續
    UPDATE account SET balance = balance + 100 WHERE id = 2;
    COMMIT;
    
  • 事務B:先更新id=2,再更新id=1。

    BEGIN;
    UPDATE account SET balance = balance - 200 WHERE id = 2;
    -- 等待事務A執行后再繼續
    UPDATE account SET balance = balance + 200 WHERE id = 1;
    COMMIT;
    
3. 觀察死鎖
  1. 按順序執行事務A和事務B的UPDATE語句。
  2. 事務A嘗試更新id=2時,因事務B持有鎖而等待。
  3. 事務B嘗試更新id=1時,因事務A持有鎖而等待。
  4. 數據庫檢測到死鎖,自動回滾其中一個事務:
    1205 - Lock wait timeout exceeded; try restarting transaction
    


三、解決死鎖的核心方法

  • 常見的解決策略包括設置合理的事務隔離級別、優化事務邏輯、使用超時機制、以及數據庫自動檢測和處理死鎖
1. 數據庫自動處理
  • 死鎖檢測:數據庫自動檢測死鎖并回滾代價較小的事務(如MySQL默認開啟)。
  • 查看死鎖日志(MySQL):
    SHOW ENGINE INNODB STATUS;  -- 查看LATEST DETECTED DEADLOCK部分
    
2. 代碼層優化
  • 統一資源訪問順序:所有事務按相同順序操作表或記錄。
    -- 所有事務先更新id=1,再更新id=2
    UPDATE account SET ... WHERE id = 1;
    UPDATE account SET ... WHERE id = 2;
    
  • 減少事務粒度:避免長事務,盡快提交或回滾。
    // 示例:使用Spring的@Transactional設置超時
    @Transactional(timeout = 5)  // 事務5秒未完成則回滾
    public void transfer() { ... }
    
  • 使用樂觀鎖:通過版本號避免行鎖競爭。
    UPDATE account 
    SET balance = 900, version = version + 1 
    WHERE id = 1 AND version = 1;
    
3. 數據庫配置調優
  • 降低隔離級別:從REPEATABLE READ改為READ COMMITTED,減少鎖沖突。
    SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
    
  • 索引優化:為WHERE條件字段添加索引,縮小鎖范圍。
    ALTER TABLE account ADD INDEX idx_id (id);
    
4. 重試機制
  • 捕獲死鎖異常:代碼中捕獲DeadlockException并重試。
    int retryCount = 0;
    while (retryCount < 3) {
        try {
            executeTransaction();
            break;
        } catch (DeadlockException e) {
            retryCount++;
            Thread.sleep(100); // 等待后重試
        }
    }
    

四、死鎖分析工具

  1. MySQL死鎖日志

    • 查看SHOW ENGINE INNODB STATUS輸出,分析TRANSACTIONWAITING FOR THIS LOCK部分。
  2. pt-deadlock-logger(Percona工具):
    實時監控死鎖事件并記錄。

    pt-deadlock-logger --user=root --password=123456 --run-time=10
    
  3. 性能模式(Performance Schema)
    MySQL 5.6+開啟性能模式,監控鎖等待事件。

    SELECT * FROM performance_schema.events_transactions_current;
    


五、預防死鎖

  1. 事務設計原則
    • 短事務優先,及時提交。
    • 避免交叉更新多張表。
  2. 統一操作順序
    所有業務邏輯按固定順序訪問資源(如按主鍵升序操作)。
  3. 監控與報警
    配置Prometheus監控死鎖次數,超過閾值觸發告警。
  4. 壓力測試
    使用JMeter模擬并發事務,驗證死鎖概率。

六、總結

  • 復現死鎖:通過交叉更新不同順序的資源,觀察數據庫自動回滾。
  • 解決方案
    • 統一資源訪問順序,減少鎖競爭。
    • 優化索引和事務設計,降低死鎖概率。
    • 結合重試機制和數據庫自動處理,提升系統容錯性。
  • 關鍵工具:數據庫日志、性能分析工具、壓力測試框架。

轉自https://juejin.cn/post/7481837718718644274


該文章在 2025/3/17 10:33:31 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 日韩一区二区三区精品 | 白白发布精品视频在线观看 | 99免费精品视频 | 国产黄a三级三级三级看三级 | 91精品国产亚洲爽啪在线观看 | ysl蜜桃色888网站 | 成人欧美一区二区三区白人 | 视频观看中文 | 国产日产欧美一区二区三区 | 欧美视频一区免费精品 | 精品二区中文字幕播放 | 欧美伦理电影大全 | 最新中文字幕在线观 | ady中文字幕| 日韩亚洲欧美一区噜噜噜 | 88国产 | 730099带你另眼看世界 | 免费高清电影在线观看 | 欧美区精品系列在线观看不卡 | 国产末成年 | 一区二区三中文 | 成人不卡 | 国产午夜爽爽窝窝在线观看 | 欧美日韩一级无毛 | 国产女主播在线观看免费观看 | 日韩欧美一卡二区 | 大伊香蕉精品一区在线 | 国产高颜值大学生情侣酒店 | yy6080午夜理论成人影院 | 论理电影 | 在线中文字幕 | 国产精品免费αv视频 | 亚洲资源最新版在线观看 | 91精品欧美产品免费观看 | 9亚洲色| 国产欧美日本在 | 麻花传媒 | 国产精品亚洲日韩au在线 | 国产在线 | 国产黃片在线观看 | 免费国人国产免费看片 |