【MySQL】之死鎖問題及其解決方案

前言


數據庫死鎖問題是我們老生常談的問題了,在我們實際開發過程中經常會遇到,為了盡量避免出現死鎖,我們需要了解出現死鎖的場景。同時,如果線上出現了死鎖之后怎么去分析、排查和解決,下面我就這兩點介紹一下。


一、數據庫死鎖介紹


1、什么是數據庫死鎖?

數據庫的死鎖是指:不同的事務在獲取資源時相互等待,導致無法繼續執行的一種情況。當發生死鎖時,數據庫系統會自動中斷其中一個事務,以解除死鎖。在數據庫中,事務可以分為讀事務和寫事務。讀事務只需要獲取讀鎖,而寫事務需要獲取寫鎖。當多個事務同時操作同一組數據時,可能會引發死鎖的出現。

2、MySQL 發生死鎖的場景

2-1、事務同時更新多個表

當一個事務同時更新多個表并且使用了不同的順序,可能會導致死鎖的發生。例如,事務 A 首先更新表 X,此時獲取到了 X 表的鎖,并在未釋放該鎖的情況下嘗試更新表 Y;而事務 B 首先更新表Y,此時獲取到了 Y 表的鎖,并在未釋放鎖的情況下嘗試更新表 X。這種情況下,兩個事務會相互等待對方的鎖釋放,從而形成死鎖。

2-2、事務嵌套

當一個事務內部開啟了另一個事務,并在內層事務中更新了某個表,而外層事務也需要更新該表的同一行記錄時,就有可能發生死鎖。因為外層事務需要等待內層事務釋放鎖,而內層事務需要等待外層事務釋放鎖。

2-3、索引順序不一致

當多個事務按照不同的順序訪問相同的數據行,并且使用了不同的索引時,可能會發生死鎖。例如,事務 A 按照索引 1 的順序訪問數據行,事務 B 按照索引 2 的順序訪問同一組數據行,這樣兩個事務之間就會產生死鎖。

2-4、不同事務同時更新相同的索引

當多個事務同時更新相同的索引時,可能會導致死鎖。這是因為事務在更新索引時會獲取對應的鎖,并在未釋放鎖的情況下嘗試更新其他數據,從而形成死鎖。


二、解決死鎖問題


如果線上發生了死鎖,我們應該采取以下步驟進行處理:

1、 監控死鎖

正常情況下我們都會建立死鎖監控機制,以便及時掌握死鎖情況;同時設置相應的預警機制,以便在死鎖發生時能夠及時處理。

通過數據庫的監控工具或命令可以查看是否存在死鎖情況,如果出現則了解死鎖的具體情況,包括死鎖的事務和死鎖的資源。

2、終止死鎖事務

根據監控結果,找到造成死鎖的事務,并手動選擇其中一個事務終止。可以根據事務的執行時間、影響行數、優先級等因素進行終止決策。可以通過 select * from information_schema.innodb_trx 語句查看死鎖情況。

在 innodb 中,有三張表可以幫助我們更好去分析死鎖信息:

  • information_schema.innodb_trx:事務信息表。
  • information_schema.innodb_locks:事務鎖的信息表。
  • information_schema.innodb_lock_waits:鎖等待關系表。

系統自動解除死鎖:

正常情況下,當發生死鎖時,MySQL 系統會自動解除死鎖,至于解除哪個事務的鎖,需要虧了一個代價,在解除死鎖方面,會選擇回滾事務產生影響最小的一個進行回滾。

這里就要提一下兩個概念了,一個是事務的權重trx_weight),另外一個是事務的調度權重trx_schedule_weight):

  • 事務的權重:與回滾事務的選擇有關。具體與事務 undo 版本鏈的長度有關,回滾的 undo 記錄越多,產生的影響就會越大,MySQL 就不會選擇這樣的事務,倘若事務權重一樣,會選擇事務等待隊列等待時間短的事務進行回滾。
  • 事務的調度權重:與事務獲取資源的先后有關。MySQL8.0.20 之前在等待鎖的事務優先級排序采取 FIFO 算法,之后采取 CATS 算法。該算法通過分配調度權限對等待的事務進行優先級排序,該權重是根據事務阻塞的事務數量計算的。例如,兩個事務正在等待同一對象上的鎖,那么阻塞最多事務的事務將被分配更大的調度權重,如果權重相等,則優先考慮等待時間最長的事務分配資源。

3、重試事務

終止死鎖事務后,需要重新執行被終止的事務。這可能需要一些邏輯處理,例如對數據進行回滾或者重新執行一些操作。

4、分析死鎖原因

通過數據庫的日志和監控信息,分析死鎖的原因。下面是查看死鎖日志的命令語句:

show engine innodb status;

分析死鎖日志然后根據死鎖原因對數據庫的設計和代碼進行優化,以盡量減少死鎖的發生。

同時也可以根據分析結果,針對性地進行數據庫結構調整、索引優化、事務隔離級別調整等措施,以降低死鎖的概率。

5、避免死鎖建議

  • 事務盡可能小,不要將復雜邏輯放進一個事務里。
  • 涉及多行記錄時,約定不同事務以相同順序訪問。
  • 業務中要及時提交或者回滾事務,可減少死鎖產生的概率。
  • 表要有合適的索引。
  • 可嘗試將隔離級別改為 ReadCommit 。

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

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

相關文章

ubuntu22.04 怎么開啟SSH服務

在 Ubuntu 22.04 LTS 中,默認情況下不會自動啟動 SSH 服務。如果你想通過 SSH 訪問你的 Ubuntu 系統,你需要手動安裝 SSH 服務器,并確保 22 端口(SSH 的默認端口)是開放的。以下是必要的步驟: 安裝 SSH 服…

Java 多線程之同步(鎖)相關類總結

文章目錄 一、概述二、volatile 可見性/有序性三、synchronized 互拆鎖/排他鎖/非觀鎖四、DCL(Double-Checked Locking)五、CAS(Compare and Set)六、ReentrantLock 可重入鎖/公平/非公平鎖七、ReentrantReadWriteLock 讀寫鎖/共享…

Day56力扣打卡

打卡記錄 數對統計&#xff08;DP狀態壓縮&#xff09; 參考文獻 #include <bits/stdc.h>using namespace std;void solve(){int n;cin >> n;map<int, int> mapp;vector<int> a(n);for (auto& x : a){cin >> x;mapp[x] ;}vector<array&…

使用WebyogSQLyog使用數據庫

數據庫 實現數據持久化到本地&#xff1a; 使用完整的管理系統統一管理&#xff0c; 數據庫&#xff08;DateBase&#xff09;&#xff1a; 為了方便數據存儲和管理&#xff08;增刪改查&#xff09;&#xff0c;將數據按照特定的規則存儲起來 安裝WebyogSQLyog -- 創建數…

101基于matlab的極限學習機ELM算法進行遙感圖像分類

基于matlab的極限學習機ELM算法進行遙感圖像分類&#xff0c;對所獲取的遙感圖片進行初步分類和最終分類。數據可更換自己的&#xff0c;程序已調通&#xff0c;可直接運行。

如何使用 Explain 分析 SQL 語句?

如何使用 Explain 分析 SQL 語句&#xff1f; MySQL中EXPLAIN命令是我們分析和優化SQL語句的利器。 如何使用EXPLAIN來分析SQL語句&#xff0c;接下來有15個例子&#xff0c;一起學習唄 1. EXPLAIN的基本使用 EXPLAIN可以用于分析MySQL如何執行一個SQL查詢&#xff0c;包括如…

ElasticSearch之cat repositories API

命令樣例如下&#xff1a; curl -X GET "https://localhost:9200/_cat/repositories?vtrue&pretty" --cacert $ES_HOME/config/certs/http_ca.crt -u "elastic:ohCxPHQBEs5*lo7F9"執行結果輸出如下&#xff1a; id type repo1 fs repo2 s3查…

python+gdal地理坐標轉投影坐標

1 前言 地理坐標系&#xff0c;是使用三維球面來定義地球表面位置&#xff0c;以實現通過經緯度對地球表面點位引用的坐標系。 地理坐標系經過地圖投影操作后就變成了投影坐標系。而地圖投影是按照一定的數學法則將地球橢球面上點的經維度坐標轉換到平面上的直角坐標。 2 流程…

基于STM32的四位數碼管計數器設計與實現

?作者簡介&#xff1a;熱愛科研的嵌入式開發者&#xff0c;修心和技術同步精進&#xff0c; 代碼獲取、問題探討及文章轉載可私信。 ? 愿你的生命中有夠多的云翳,來造就一個美麗的黃昏。 &#x1f34e;獲取更多嵌入式資料可點擊鏈接進群領取&#xff0c;謝謝支持&#xff01;…

Docker Compose(容器編排)——9

目錄 什么是 Docker Compose生活案例為什么要 Docker ComposeDocker Compose 的安裝Docker Compose 的功能Docker Compose 使用場景Docker Compose 文件&#xff08;docker-compose.yml&#xff09; 文件語法版本文件基本結構及常見指令Docker Compose 命令清單 命令清單如下命…

垃圾回收器CMS和G1的區別

CMS和G1的區別 區別一&#xff1a; 使用范圍不一樣 CMS收集器是老年代的收集器&#xff0c;可以配合新生代的Serial和ParNew收集器一起使用 G1收集器收集范圍是老年代和新生代。不需要結合其他收集器使用 區別二&#xff1a; STW的時間 CMS收集器以最小的停頓時間為目標的收…

C++11(下)

可變參數模板 C11的新特性可變參數模板能夠創建可以接受可變參數的函數模板和類模板. 相比C98/03, 類模版和函數模版中只能含固定數量的模版參數, 可變模版參數無疑是一個巨大的改進, 然而由于可變模版參數比較抽象, 使用起來需要一定的技巧, 所以這塊還是比較晦澀的.掌握一些基…

Vue 3項目的運行過程

概述&#xff1a; 使用Vite構建Vue 3項目后&#xff0c;當執行yarn dev命令啟動服務時&#xff0c;項目就會運行起來&#xff0c;該項目會通過src\main.js文件將src\App.vue組件渲染到index.html文件的指定區域。 文件介紹&#xff1a; src\App.vue文件 Vue 3項目是由各種組件…

遞歸實現指數型枚舉

title: 遞歸實現指數型枚舉 date: 2023-12-10 19:29:20 tags: 遞歸 catgories: 算法進階指南 —> 傳送門 題目大意 從 1 ~ n n n 這 n n n 個整數隨機選取任意多個&#xff0c;輸出所有可能的選擇方案 思路 這等價于每個整數可以選或者不選&#xff0c;所有的方案總數共有…

Spring Boot的日志

打印日志 打印日志的步驟: ? 在程序中得到日志對象. ? 使用日志對象輸出要打印的內容 在程序中得到日志對象 在程序中獲取日志對象需要使用日志工廠LoggerFactory,代碼如下: package com.example.demo;import org.slf4j.Logger; import org.slf4j.LoggerFactory;public c…

STM32——繼電器

繼電器工作原理 單片機供電 VCC GND 接單片機&#xff0c; VCC 需要接 3.3V &#xff0c; 5V 不行&#xff01; 最大負載電路交流 250V/10A &#xff0c;直流 30V/10A 引腳 IN 接收到 低電平 時&#xff0c;開關閉合。

Go Fyne 入門

Fyne是一個用于創建原生應用程序的UI工具包&#xff0c;它簡單易用&#xff0c;并且支持跨平臺。以下是一個簡單的Fyne教程&#xff0c;幫助你入門&#xff1a; 1. 安裝Fyne 首先&#xff0c;確保你已經安裝了Go語言。然后&#xff0c;在終端中運行以下命令來安裝Fyne&#x…

android-xml語法

xml解析器 Android的XML文件語法是由Android系統中的解析器解析的。具體來說&#xff0c;Android使用了一個名為"Android Asset Packaging Tool (AAPT)"的工具來解析和處理XML文件。AAPT負責將XML文件編譯為二進制格式&#xff0c;并在構建過程中將其打包到Android應…

第2節:Vue3 模板語法

Vue3 的模板語法主要包括以下幾個部分&#xff1a; 插值表達式&#xff1a;使用雙大括號 {{ }} 包裹變量&#xff0c;可以直接在模板中顯示變量的值。 <div>{{ message }}</div>指令&#xff1a;以 v- 開頭&#xff0c;后面跟一個自定義的名字&#xff0c;用于操…

從Centos-7升級到Centos-Stream-8

如果在正式環境升級&#xff0c;請做好數據備份以及重要配置備份&#xff01;因為升級會造一部分應用被卸載。 注意&#xff1a;升級前請備份好數據&#xff0c;升級可能會導致ssh的root用戶無法登陸、網卡名稱發生改變、引導丟失無法開機等問題。 1.安裝epel源 yum -y install…