91网首页-91网页版-91网在线观看-91网站免费观看-91网站永久视频-91网站在线播放

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

數(shù)據(jù)庫(kù)死鎖場(chǎng)景如何復(fù)現(xiàn)和解決?

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

需了解死鎖先看這一篇

死鎖是如何被發(fā)現(xiàn)和解決的?這篇文章告訴你

一、死鎖的產(chǎn)生原因

  • 死鎖發(fā)生在兩個(gè)或多個(gè)事務(wù)相互等待對(duì)方釋放鎖,導(dǎo)致它們都無(wú)法繼續(xù)執(zhí)行的情況,形成死鎖。
  • 這種情況在并發(fā)高的系統(tǒng)中比較常見(jiàn),尤其是在多個(gè)事務(wù)同時(shí)操作相同的數(shù)據(jù)時(shí)。

常見(jiàn)場(chǎng)景包括:

  1. 不同順序訪問(wèn)資源:事務(wù)A先操作表1再操作表2,事務(wù)B先操作表2再操作表1。
  2. 索引缺失:全表掃描導(dǎo)致鎖范圍擴(kuò)大,增加沖突概率。
  3. 長(zhǎng)事務(wù):事務(wù)長(zhǎng)時(shí)間未提交,導(dǎo)致鎖持有時(shí)間過(guò)長(zhǎng)。

二、死鎖場(chǎng)景復(fù)現(xiàn)(以MySQL為例)

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

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

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


三、解決死鎖的核心方法

  • 常見(jiàn)的解決策略包括設(shè)置合理的事務(wù)隔離級(jí)別、優(yōu)化事務(wù)邏輯、使用超時(shí)機(jī)制、以及數(shù)據(jù)庫(kù)自動(dòng)檢測(cè)和處理死鎖。
1. 數(shù)據(jù)庫(kù)自動(dòng)處理
  • 死鎖檢測(cè):數(shù)據(jù)庫(kù)自動(dòng)檢測(cè)死鎖并回滾代價(jià)較小的事務(wù)(如MySQL默認(rèn)開(kāi)啟)。
  • 查看死鎖日志(MySQL):
    SHOW ENGINE INNODB STATUS;  -- 查看LATEST DETECTED DEADLOCK部分
    
2. 代碼層優(yōu)化
  • 統(tǒng)一資源訪問(wèn)順序:所有事務(wù)按相同順序操作表或記錄。
    -- 所有事務(wù)先更新id=1,再更新id=2
    UPDATE account SET ... WHERE id = 1;
    UPDATE account SET ... WHERE id = 2;
    
  • 減少事務(wù)粒度:避免長(zhǎng)事務(wù),盡快提交或回滾。
    // 示例:使用Spring的@Transactional設(shè)置超時(shí)
    @Transactional(timeout = 5)  // 事務(wù)5秒未完成則回滾
    public void transfer() { ... }
    
  • 使用樂(lè)觀鎖:通過(guò)版本號(hào)避免行鎖競(jìng)爭(zhēng)。
    UPDATE account 
    SET balance = 900, version = version + 1 
    WHERE id = 1 AND version = 1;
    
3. 數(shù)據(jù)庫(kù)配置調(diào)優(yōu)
  • 降低隔離級(jí)別:從REPEATABLE READ改為READ COMMITTED,減少鎖沖突。
    SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
    
  • 索引優(yōu)化:為WHERE條件字段添加索引,縮小鎖范圍。
    ALTER TABLE account ADD INDEX idx_id (id);
    
4. 重試機(jī)制
  • 捕獲死鎖異常:代碼中捕獲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工具):
    實(shí)時(shí)監(jiān)控死鎖事件并記錄。

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

    SELECT * FROM performance_schema.events_transactions_current;
    


五、預(yù)防死鎖

  1. 事務(wù)設(shè)計(jì)原則
    • 短事務(wù)優(yōu)先,及時(shí)提交。
    • 避免交叉更新多張表。
  2. 統(tǒng)一操作順序
    所有業(yè)務(wù)邏輯按固定順序訪問(wèn)資源(如按主鍵升序操作)。
  3. 監(jiān)控與報(bào)警
    配置Prometheus監(jiān)控死鎖次數(shù),超過(guò)閾值觸發(fā)告警。
  4. 壓力測(cè)試
    使用JMeter模擬并發(fā)事務(wù),驗(yàn)證死鎖概率。

六、總結(jié)

  • 復(fù)現(xiàn)死鎖:通過(guò)交叉更新不同順序的資源,觀察數(shù)據(jù)庫(kù)自動(dòng)回滾。
  • 解決方案
    • 統(tǒng)一資源訪問(wèn)順序,減少鎖競(jìng)爭(zhēng)。
    • 優(yōu)化索引和事務(wù)設(shè)計(jì),降低死鎖概率。
    • 結(jié)合重試機(jī)制和數(shù)據(jù)庫(kù)自動(dòng)處理,提升系統(tǒng)容錯(cuò)性。
  • 關(guān)鍵工具:數(shù)據(jù)庫(kù)日志、性能分析工具、壓力測(cè)試框架。

轉(zhuǎn)自https://juejin.cn/post/7481837718718644274


該文章在 2025/3/17 10:33:31 編輯過(guò)
關(guān)鍵字查詢(xún)
相關(guān)文章
正在查詢(xún)...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專(zhuān)業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類(lèi)企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶(hù)的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 午夜国产精品精品 | 精品美女在线 | 国产综合第1页国产 | 国产黄频视频免费 | 九九热在线观看官网 | 国产色综合免费观看 | 日本汚视频在线观 | 国产欧美日本在线 | 日韩欧美制服另类 | 国产国拍亚洲精品永 | 欧美日韩欧美 | 日韩轮流片福利 | 日韩不卡中文字幕 | 国产日产一区二 | 国产免费大黄 | 97色精品 | 成人亚洲 | 国产精品亚洲综合色 | 日韩精品亚 | 国产精品视频露脸 | 日本视频一区二区 | 成人三级在线播放 | 国产精品区二 | 成人影视在线看 | 国产女与黑 | 国产中文字幕永久 | 91宅福利| 欧美性爱免费网站 | 绿巨人视频污app | 国产思思精品视频 | 日本中文字幕网址 | 人人看人人干 | 国产露脸刺激对白 | 日本在线小视频 | 无码乱码av天堂一区二区 | 欧美最新免费一 | 国内精品视频 | 黑人巨大精品欧 | 欧美日韩一区四区 | 国产精品黄 | 欧美在线免费看 |