【面試場景題】交易流水表高qps寫入會有鎖等待或死鎖問題嗎

文章目錄

      • 一、先明確交易流水表的核心特性
      • 二、InnoDB的鎖機制在流水表寫入場景的表現
        • 1. 行鎖(Record Lock):基本不涉及
        • 2. 間隙鎖(Gap Lock)與Next-Key Lock:幾乎不觸發
        • 3. 表鎖:僅在極端場景出現
      • 三、死鎖風險:幾乎為零
      • 四、潛在鎖等待場景及規避方案
        • 1. 主鍵無序導致的插入位置沖突
        • 2. 后臺任務的范圍鎖阻塞插入
        • 3. DDL操作阻塞寫入
      • 五、總結

InnoDB引擎的交易流水表在“高QPS大量寫入、無更新”場景下,鎖等待或死鎖的概率極低,但仍需注意特定場景下的潛在風險。以下從InnoDB鎖機制本質出發,結合流水表特性具體分析:

一、先明確交易流水表的核心特性

交易流水表的典型特征是:

  • 只寫不更刪:數據一旦寫入,不會執行UPDATEDELETE(即使錯誤也通過“沖正流水”新增反向記錄,而非修改原記錄);
  • 主鍵有序:通常用雪花算法或自增ID作為主鍵(PRIMARY KEY),寫入時按主鍵順序追加;
  • 高頻插入:QPS可能達數千甚至數萬,需持續寫入新記錄。

二、InnoDB的鎖機制在流水表寫入場景的表現

InnoDB的鎖(行鎖、間隙鎖、表鎖等)主要針對并發修改(UPDATE/DELETE) 設計,而流水表的“純插入”場景幾乎不觸發復雜鎖邏輯:

1. 行鎖(Record Lock):基本不涉及

行鎖用于鎖定特定記錄,防止并發修改。但流水表無UPDATE/DELETE操作,只有INSERT,而INSERT操作僅在“插入瞬間”對新生成的記錄加短暫的行鎖(用于事務隔離),且插入完成后立即釋放,不會產生鎖等待。

例外場景:若插入的主鍵值已存在(如主鍵重復),InnoDB會對“已存在的記錄”加行鎖,導致后續插入失敗并報錯Duplicate entry,但這是業務錯誤(主鍵生成邏輯問題),并非鎖等待。

2. 間隙鎖(Gap Lock)與Next-Key Lock:幾乎不觸發

間隙鎖用于鎖定“記錄之間的間隙”,防止并發插入導致的“幻讀”,是InnoDB在RR(Repeatable Read)隔離級別下的核心鎖機制。但它的觸發條件是:

  • 基于非唯一索引范圍查詢執行UPDATE/DELETE(如DELETE FROM log WHERE amount > 1000);
  • 或使用唯一索引但條件為范圍查詢(如UPDATE log SET status=1 WHERE id BETWEEN 100 AND 200)。

而流水表的特性決定了:

  • UPDATE/DELETE,不會主動觸發間隙鎖;
  • INSERT操作可能在“插入位置”產生臨時的“插入意向鎖”(Insert Intention Lock),這是一種間隙鎖的兼容鎖,僅用于表示“插入意圖”,多個事務插入不同位置時互不阻塞(如主鍵有序的流水表,事務A插入ID=100,事務B插入ID=101,兩者插入位置不同,無鎖沖突)。

唯一風險:若流水表存在非唯一索引且有其他業務操作(如后臺統計任務執行SELECT ... FOR UPDATE范圍查詢),可能對索引間隙加鎖,導致新插入的記錄恰好落在鎖范圍內,引發INSERT等待。但流水表通常無此類操作(純寫入,查詢走從庫),因此風險極低。

3. 表鎖:僅在極端場景出現

InnoDB默認行鎖,但以下情況會觸發表鎖:

  • 執行ALTER TABLE等DDL操作(會加表級排他鎖);
  • 未命中索引的UPDATE/DELETE(退化為表鎖)。

流水表若需在線加字段或索引(DDL),會阻塞所有寫入(INSERT),導致鎖等待。但這是運維操作導致的,并非寫入本身引發。

三、死鎖風險:幾乎為零

死鎖的產生需要“多個事務相互持有對方需要的鎖”,而流水表的純寫入場景:

  • 所有事務僅執行INSERT,操作的是不同的新記錄(主鍵有序時,插入位置遞增,無重疊);
  • UPDATE/DELETE,不會持有舊記錄的鎖;
  • 插入意向鎖是兼容的(同一間隙可并發插入不同位置),不會產生相互等待。

因此,純寫入的流水表幾乎不可能出現死鎖

四、潛在鎖等待場景及規避方案

雖然風險低,但以下場景可能引發鎖等待,需提前規避:

1. 主鍵無序導致的插入位置沖突

若流水表主鍵是無序的(如UUID),INSERT會隨機寫入B+樹的>不同位置,可能導致多個事務在同一間隙競爭插入意向鎖,引發短暫等待(通常毫秒級,不影響整體性能)。

規避:用有序主鍵(如雪花算法,包含時間戳),確保INSERT在B+樹尾部順序追加,避免間隙競爭。

2. 后臺任務的范圍鎖阻塞插入

若有后臺任務(如定時統計)對流水表執行SELECT ... FOR UPDATE(加排他鎖的范圍查詢),且查詢條件命中非唯一索引,會鎖定對應間隙,導致新插入的記錄落在鎖范圍內時被阻塞。

規避

  • 統計查詢走從庫,避免在主庫執行加鎖查詢;
  • 若必須在主庫查詢,改用SELECT ... LOCK IN SHARE MODE(共享鎖),或不加鎖(依賴MVCC快照讀)。
3. DDL操作阻塞寫入

執行ALTER TABLE(如加索引、加字段)時,InnoDB會加表級排他鎖,阻塞所有INSERT,導致寫入等待。

規避

  • 用Online DDL工具(如pt-online-schema-change),避免鎖表;
  • 選擇流量低谷執行DDL,并限制單次操作的數據量。

五、總結

InnoDB交易流水表在“高QPS大量寫入、無更新”場景下:

  • 無死鎖風險:純插入操作不會產生鎖競爭循環;
  • 鎖等待概率極低:僅在“主鍵無序+高并發”“后臺加鎖查詢”“執行DDL”等特殊場景可能出現,且可通過優化規避;
  • 間隙鎖幾乎不觸發:因無UPDATE/DELETE操作,不會主動加間隙鎖,插入意向鎖兼容不阻塞。

最佳實踐

  1. 用有序主鍵(如雪花算法),確保插入順序追加;
  2. 禁止在主庫執行加鎖的范圍查詢(FOR UPDATE);
  3. 避免頻繁執行DDL,必要時用Online DDL工具;
  4. 監控Innodb_row_lock_waits等指標,及時發現異常鎖等待。

通過以上設計,流水表可穩定支撐高QPS寫入,幾乎無鎖相關問題。

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

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

相關文章

項目部署——LAMP、LNMP和LTMJ

前情提要問:如何通過nginx的反向代理,代理多臺虛擬主機(一臺apache服務器上的虛擬主機)?1.在nginx的配置文件中,將基于域名的訪問改為基于端口的訪問(nginx.conf)upstream daili{ser…

晨曦中,它已勞作:一臺有溫度的機器人如何重塑我們的潔凈日常

清晨六點,城市的輪廓在微光中逐漸清晰。某高端小區的路面上,一臺灰色機身、線條流暢的機器正在安靜地工作。它繞過停靠的車輛,精準地沿著路緣石前進,吸走落葉與塵土,遇到突然竄出的流浪貓時輕巧避讓,仿佛有…

【最新高級版】酷柚易汛生產管理系統v1.2.8 +uniapp全開源+文檔教程

酷柚易汛生產管理系統是基于FastAdminThinkPHPLayuiuniapp開發的生產管理系統,幫助企業數字化轉型,打造智能工廠,專業為生產企業量身開發的一套完整的生產管理系統。主要包含以下模塊:購貨模塊、生產模塊、倉庫模塊、資料模塊&…

40分鐘的Docker實戰攻略

一:什么是Docker (1)基本概念 Docker 是一種開源的 容器化平臺,用于快速構建、部署和運行應用程序。它通過將應用程序及其依賴項打包到輕量級的、可移植的容器中,實現了環境一致性,解決了“在我機器上能運…

qt使用camke時,采用vcpkg工具鏈設置OSG的qt模塊osgQOpenGLWidget

【免費】osgQOpenGLWidget嵌入qt模塊,VS2022使用cmake的方式,工具鏈vcpkg資源-CSDN下載 CMake中設置 1.查找osg相關的庫,同時也會設置對應include的路徑 # 檢查是否找到 osg find_package(OpenSceneGraph 3.6.5REQUIRED COMPONENTS osgosgUtilosgGAosgViewerosgDBosgAnimatio…

洛谷 P2245 星際導航(kruskal 重構樹 + 倍增優化求路徑最大邊權)

題目鏈接 題目難度 洛谷上是藍題&#xff0c;我覺得這道題挺簡單的&#xff0c;一眼就看穿了&#xff0c;應該是綠題。 題目解法概括 kruskal 重構樹 倍增優化求路徑最大邊權。 代碼 #include <iostream> #include <vector> #include <algorithm> #in…

STM32H743-ARM例程1-IDE環境搭建與調試下載

目錄實驗平臺環境搭建一、Keil MDK集成開發環境1.MDK簡介2.MDK5安裝3.程序下載與調試二、STM32CubeMX1.STM32CubeMX簡介2.JAVA JRE安裝3.STM32CubeMX安裝4.STM32CubeH7庫安裝實驗平臺 硬件&#xff1a;銀杏科技GT7000雙核心開發板-ARM-STM32H743XIH6&#xff0c;銀杏科技iTool…

FPGA學習篇——Verilog學習MUX的實現

PS&#xff1a;目前手上仍然沒有板子&#xff0c;按照野火視頻的講解&#xff0c;目前我們只能做到前面六步&#xff08;其實第一步設計規劃也是需要看板子的硬件的&#xff0c;但是現在沒有板子就完全與野火傳授的板子一致來看&#xff09; 首先我們以最簡單的2路選擇器MUX2_1…

OpenStack 學習筆記

OpenStack 1. 什么是 OpenStack 1.1 OpenStack 發展史 2006 年亞馬遜推出 AWS&#xff0c;正式開啟云計算的新紀元 2010 年 7 月美國國家航空航天局&#xff08;NASA&#xff09;與 Rackspace 合作&#xff0c;共同宣布 OpenStack 開放源碼計劃&#xff0c;由此開啟了屬于 Open…

mysql小數取整

1 向下取整 SELECT FLOOR(123.456); -- 結果: 1232 向上取整 SELECT CEIL(123.001); -- 結果: 1243 四舍五入 SELECT ROUND(123.456); -- 結果: 123 SELECT ROUND(123.556); -- 結果: 1244 截斷&#xff08;不四舍五入&#xff0c;直接截斷小數位&#xff09; SELECT …

Day43 PHP(mysql不同注入類型、mysql不同注入點、mysql傳輸不同數據類型 )

一、不同注入類型實際&#xff1a;我們未知sql是哪種類型&#xff0c;只能靠試/使用sql工具原理&#xff1a;閉合程序員寫的sql語句&#xff0c;并且執行我們所需要的sql語句&#xff0c;最后將閉合后多余的 用-- 或者#注釋掉。 總結一下就是先閉合&#xff0c;后注釋。共四種…

Linux應用開發(君正T23):三網智能切換及配網功能

前段時間接手了一個監控項目&#xff0c;其中甲方對于設備的要求有一條就是實現網口eth、WiFi、4G三種手段的聯網方式并且當某一個網絡不好的時候就去切換到下一個能用的網絡&#xff0c;讓監控設備持續不斷的有網絡&#xff0c;保證監控數據的上傳。這個部分的功能就交由我來實…

IvorySQL 4.6:DocumentDB+FerretDB 實現 MongoDB 兼容部署指南

背景 MongoDB 誕生之初&#xff0c;便以出色的易用性與詳盡的驅動程序文檔脫穎而出&#xff0c;堪稱對傳統關系型數據庫的一次重要革新&#xff0c;也正因如此&#xff0c;它迅速成為開發者社區的熱門之選。 然而&#xff0c;隨著其許可模式從開源轉向 SSPL 許可證&#xff0…

論文閱讀:arixv 2025 One Token to Fool LLM-as-a-Judge

總目錄 大模型相關研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 https://arxiv.org/pdf/2507.08794 https://www.doubao.com/chat/20698287584991234 速覽 這篇文檔主要講了一個關于“大語言模型當裁判”的重要發現——很多我們以為靠譜的AI裁…

webrtc弱網-AlrDetector類源碼分析與算法原理

AlrDetector&#xff08;應用受限區域檢測器&#xff09;是WebRTC中用于檢測發送端是否處于應用層限速狀態的核心組件。它通過維護一個基于時間間隔的預算系統&#xff0c;監控實際發送數據量與網絡容量之間的關系。當發送速率持續低于網絡容量的設定比例&#xff08;如65%&…

ABP + Verify(快照) 驅動的 PDF/Excel 導出回歸

ABP + Verify(快照) 驅動的 PDF/Excel 導出回歸 ?? ?? 目錄 ABP + Verify(快照) 驅動的 PDF/Excel 導出回歸 ?? 0) TL;DR ? 1) 背景與目標 ?? 2) 架構與職責(解耦渲染器) ?? 3) “確定性”前置條件(去偽差異) ?? 4) PDF 回歸策略(以 QuestPDF 為例) ?? 4.…

SIFT特征匹配實戰:KNN算法實現指紋認證

這個利用了前面學到的SIFT特征檢測來實現的&#xff0c;然后這里主要就是引入了一個新的匹配器。這里匹配是用KNN算法進行匹配的。下面來看下細節。介紹函數由于要頻繁展示&#xff0c;所以這里定義了一個函數。def cv_show(name, img):cv2.imshow(name, img)cv2.waitKey(0)導入…

網絡安全滲透測試第一步信息收集

信息收集是滲透測試中最基礎且關鍵的一步&#xff0c;它直接影響后續漏洞發現和利用的成功率。本文將系統介紹信息收集的常用方法、工具和技巧&#xff0c;幫助你在實戰中高效定位目標弱點。 一、搜索引擎利用 1. Google Hacking 通過Google搜索語法快速定位敏感信息、后臺地…

C++——類和對象1

1.類的定義1.1 類定義格式class為定義類的關鍵字&#xff0c;Stack為類的名字&#xff0c;{ }中的內容是類的主題為了&#xff0c;注意類定義結束時后面的分號不能省略。類體中的內容稱為類的成員&#xff1a;類中的變量稱為類的屬性或成員變量&#xff1b;類中的函數稱為類的方…

動手學Agent:Agent設計模式——構建有效Agent的7種模型

Agent本身的定義也不是絕對的&#xff0c;從LLM到最高等級的Agent&#xff0c;中間是有大量灰度地帶的&#xff0c;在Anthropic看來&#xff0c;Agent可以以多種方式定義&#xff0c;有些人將完全自主系統定義為Agent&#xff0c;而另一些團隊則將預定義的工作流程定義為Agent。…