手把手教你定位線上MySQL鎖超時問題,包教包會

来源:https://www.cnblogs.com/yidengjiagou/archive/2022/08/11/16575614.html
-Advertisement-
Play Games

昨晚我正在床上睡得著著的,突然來了一條簡訊。 什麼?線上的訂單無法取消! 我趕緊登錄線上系統,查看業務日誌。發現有MySQL鎖超時的錯誤日誌。 ...


昨晚我正在床上睡得著著的,突然來了一條簡訊。

image

什麼?線上的訂單無法取消!

我趕緊登錄線上系統,查看業務日誌。

image

發現有MySQL鎖超時的錯誤日誌。

不用想,肯定有另一個事務正在修改這條訂單,持有這條訂單的鎖。

導致當前事務獲取不到鎖,一直等待,直到超過鎖超時時間,然後報錯。

既然問題已經清楚了,接下來就輪到怎麼排查一下到底是哪個事務正在持有這條訂單的鎖。

好在MySQL提供了豐富的工具,幫助我們排查鎖競爭問題。

現場復現一個這個問題:

創建一張用戶表,造點數據:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
  `name` varchar(50) NOT NULL DEFAULT '' COMMENT '姓名',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

事務1,更新id=1的用戶姓名,不提交事務:

begin;
update user set name='一燈' where id=1;

事務2,刪除id=1的數據,這時候會產生鎖等待:

begin;
delete from user where id=1;

接下來,我們就通過MySQL提供的鎖競爭統計表,排查一下鎖等待問題:

先查一下鎖等待情況:

select * from information_schema.innodb_lock_waits;

image

可以看到有一個鎖等待的事務。

然後再查一下正在競爭的鎖有哪些?

select * from information_schema.innodb_locks;

image

可以看到,MySQL統計的非常詳細:

lock_trx_id 表示事務ID

lock_mode 表示排它鎖還是共用鎖

lock_type 表示鎖定的記錄,還是範圍

lock_table 鎖的表名

lock_index 鎖定的是主鍵索引

再查一下正在執行的事務有哪些?

select * from information_schema.innodb_trx; 

image

可以清楚的看到正在執行的事務有兩個,一個狀態是鎖等待(LOCK WAIT),正在執行的SQL也列印出來了:

delete from user where id=1;

正是事務2的刪除語句。

不用問,第二條,顯示正在運行狀態(RUNNING)的事務就是正在持有鎖的事務1,MySQL線程id(trx_mysql_thread_id)是193。

我們用MySQL線程id查一下事務線程id:

select * from performance_schema.threads where processlist_id=193;

image

找到對應的事務線程id是218,然後再找一下這個線程正在執行的SQL語句:

select THREAD_ID,CURRENT_SCHEMA,SQL_TEXT 
from performance_schema.events_statements_current 
where thread_id=218;

image

可以清楚的看到這個線程正在執行的SQL語句就是事務1的update語句。

持有鎖的SQL語句找到了,接下來再去找對應的業務代碼也就輕而易舉了。

以上是基於MySQL5.7版本,在MySQL8.0版本中有些命令已經刪除了,替換成了其他命令,下篇文章再講一下MySQL8.0怎麼定位MySQL鎖超時問題。

文章持續更新,可以微信搜一搜「 一燈架構 」第一時間閱讀更多技術乾貨。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 基於.NetCore的積木化服務框架(Gitee地址),主要將常規解決方案進行進一步的抽象下沉形成相關基礎可選框架單元(在Framework 目錄),併在此基礎上實現常規系統模塊(在Modules 目錄),如用戶管理,許可權管理等。 當前項目,目的是為了提供一個思路,而不是模板。除了 Framewor ...
  • 此案例是《.Net WebView2 項目,實現 嵌入 WEB 頁面 Chromium內核》文的續集。 主要是針對WebView2的一些微軟自己封裝的不熟悉的API,有一些人已經對 PuppeteerSharp很熟悉了,那麼,直接用 PuppeteerSharp的話,那就降低了學習成本,那還是很有必 ...
  • 1.避免Scoped模式註冊的服務變成Singleton模式 當提供一個生命周期模式為Singleton的服務實例時,如果發現該服務中還依賴生命周期模式為Scoped的服務實例(Scoped服務實例將被一個Singleton服務實例所引用),那麼這個被依賴的Scoped服務實例最終會成為一個Sing ...
  • 作為一個沒有系統學習過依賴註入的開發者而言,如果直接在一個使用依賴註入的框架下進行開發,往往對於依賴註入的存在是沒有明顯的察覺,通過代碼追根溯源你都會看不出對象是從哪裡創建的。但這並不影響你進行開發的工作,你可以參照現有代碼的使用形式,將需要使用的對象加入到構造函數的參數列表上,你就可以使用對象,調 ...
  • 1.JDBC體繫系統 一組規範:介面 JDBC介面(API)包括兩個層次: 面嚮應用的API:Java API,抽象介面,供應用開發人員使用(連接資料庫,執行SQL語句,獲得結果) 面向資料庫的API:Java Driver API,供開發商開發資料庫驅動程式 JDBC是sun公司提供一套用於資料庫 ...
  • 3. ETCD 常用命令 etcdctl是一個命令行的客戶端,它提供了一些命令,可以方便我們在對服務進行測試或者手動修改資料庫內容。etcdctl與kubectl和systemctl的命令原理及操作類似,其基本用法如下所示: etcdctl [global options] command [com ...
  • 前言 最近在centos8系統下部署django項目時,要用到mysql資料庫,在安裝中遇到了點坑,之後參考了一位博主的文章,也是順利的安裝配置成功,博主原文連接: []((20條消息) centos8安裝mysql8.0.22教程(超詳細)_上善若水滴世界的博客-CSDN博客_centos mys ...
  • ​ 點亮 ⭐️ Star · 照亮開源之路 GitHub:https://github.com/apache/dolphinscheduler ​ 版本發佈 2022/8/10 2022 年 8 月 10 日,Apache DolphinScheduler 在經過 3.0.0 alpha、3.0.0 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...