使用分布式鎖和樂觀鎖解決超賣問題

在電商、秒殺等高并發場景中,“超賣”問題指庫存被過量扣減,導致實際庫存不足。以下是使用 分布式鎖樂觀鎖 解決超賣問題的原理與實現方案:


一、超賣問題的核心原因

多個并發請求同時讀取庫存余量,并在本地計算后發起寫操作,導致實際扣減后的庫存為負數。


二、解決方案 1:分布式鎖

核心思想

通過 強制串行化 扣減庫存操作,同一時間僅一個請求能處理庫存。

實現步驟(以 Redis 為例):
  1. 獲取鎖
    使用 SET key uuid NX EX timeout 命令,確保原子性加鎖。

    import redis
    r = redis.Redis()def acquire_lock(product_id, uuid, expire=10):key = f"lock:{product_id}"return r.set(key, uuid, nx=True, ex=expire)
    
  2. 扣減庫存
    在鎖的保護下執行庫存操作:

    UPDATE inventory SET stock = stock - 1 WHERE product_id = 1 AND stock > 0;
    
  3. 釋放鎖
    使用 Lua 腳本保證原子性釋放(避免誤刪其他請求的鎖):

    if redis.call("get", KEYS[1]) == ARGV[1] thenreturn redis.call("del", KEYS[1])
    elsereturn 0
    end
    
優缺點
  • 優點:強一致性,邏輯簡單。
  • 缺點:性能瓶頸(串行化)、鎖失效風險(需合理設置超時時間)。

三、解決方案 2:樂觀鎖

核心思想

基于 版本號條件判斷,在更新時校驗數據未被修改,若沖突則重試或失敗。

實現步驟(以 MySQL 為例):
  1. 查詢庫存與版本號

    SELECT stock, version FROM inventory WHERE product_id = 1;
    
  2. 更新庫存(帶條件)
    通過版本號或庫存量確保原子性:

    -- 版本號方式
    UPDATE inventory 
    SET stock = stock - 1, version = version + 1 
    WHERE product_id = 1 AND version = {old_version} AND stock > 0;-- 條件判斷方式(直接校驗庫存)
    UPDATE inventory 
    SET stock = stock - 1 
    WHERE product_id = 1 AND stock = {queried_stock} AND stock > 0;
    
  3. 檢查更新結果
    若影響行數為 0,說明沖突,需重試或返回錯誤。

代碼示例(偽代碼):
def deduct_stock():retries = 3for _ in range(retries):# 查詢庫存和版本stock, version = db.query("SELECT stock, version FROM inventory WHERE product_id=1")if stock <= 0:return "庫存不足"# 嘗試更新rows = db.execute("UPDATE inventory SET stock=stock-1, version=version+1 ""WHERE product_id=1 AND version=%s AND stock>0",version)if rows > 0:return "成功"return "請重試"
優缺點
  • 優點:高并發性能好,無鎖競爭。
  • 缺點:需處理重試邏輯,沖突頻繁時性能下降。

四、方案對比與選型

方案適用場景性能復雜度一致性
分布式鎖強一致性、低并發沖突強一致性
樂觀鎖高并發、沖突較少最終一致性

五、增強方案

  1. 結合緩存優化

    • 使用 Redis 預扣庫存,異步同步到數據庫。
    • 例如:先扣減 Redis 中的庫存,再通過消息隊列更新數據庫。
  2. 庫存分段

    • 將庫存拆分為多個段(如 100 個庫存拆為 10 段),每段獨立加鎖,提升并發度。
  3. 限流與降級

    • 使用令牌桶或漏桶算法限制請求流量,防止系統過載。

六、注意事項

  1. 分布式鎖的可靠性
    • 推薦 Redlock 算法(多節點 Redis)或 ZooKeeper 實現高可用鎖。
  2. 樂觀鎖的重試策略
    • 限制最大重試次數,避免無限循環。
  3. 事務隔離級別
    • 確保數據庫隔離級別為 Read Committed 或以上,避免臟讀。

通過合理選擇鎖機制并結合業務場景優化,可有效解決超賣問題。

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

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

相關文章

盛水最多的容器

本題有兩種解法&#xff0c;一種是暴力解法&#xff0c;直接暴力枚舉出所有的體積比較出最大的即可&#xff0c;但是時間復雜度達到n方。超出了限制&#xff0c;另一種解法就是利用單調性解法&#xff0c;我們著重介紹一下單調性解法。 單調性解法&#xff1a; 體積vh*w&…

操作系統概述(3)

批處理系統 1.單道批處理系統 單道批處理系統是成批地處理作用&#xff0c;并且始終只有一道作業在內存中的系統。優點&#xff1a;提高系統資源的利用率和系統吞吐量。缺點&#xff1a;系統中的資源得不到充分利用。 2.多道批處理系統 引入多道程序設計技術&#xff0c;是…

數字身份DID協議:如何用Solidity編寫去中心化身份合約

本文提出基于以太坊的自主主權身份&#xff08;SSI&#xff09;實現方案&#xff0c;通過擴展ERC-734/ERC-735標準構建鏈上身份核心合約&#xff0c;支持可驗證聲明、多密鑰輪換、屬性隱私保護等特性。設計的三層架構體系將身份控制邏輯與數據存儲分離&#xff0c;在測試網環境…

【目標檢測】【深度學習】【Pytorch版本】YOLOV2模型算法詳解

【目標檢測】【深度學習】【Pytorch版本】YOLOV2模型算法詳解 文章目錄 【目標檢測】【深度學習】【Pytorch版本】YOLOV2模型算法詳解前言YOLOV2的模型結構YOLOV2模型的基本執行流程YOLOV2模型的網絡參數YOLOV2模型的訓練方式 YOLOV2的核心思想前向傳播階段反向傳播階段 總結 前…

第421場周賽:數組的最大因子得分、

Q1、數組的最大因子得分 1、題目描述 給你一個整數數組 nums。 因子得分 定義為數組所有元素的最小公倍數&#xff08;LCM&#xff09;與最大公約數&#xff08;GCD&#xff09;的 乘積。 在 最多 移除一個元素的情況下&#xff0c;返回 nums 的 最大因子得分。 注意&…

機器學習(神經網絡基礎篇)——個人理解篇5(梯度下降中遇到的問題)

在神經網絡訓練中&#xff0c;計算參數的梯度是關鍵步驟。numerical_gradient 方法旨在通過數值微分&#xff08;中心差分法&#xff09;計算損失函數對網絡參數的梯度。然而&#xff0c;該方法的實現存在一個關鍵問題&#xff0c;導致梯度計算錯誤。 1、錯誤代碼示例&#xf…

40常用控件_WindowFrame的影響

window frame 的影響 如果 widget 作為一個窗口(帶有標題欄,最小化,最大化,關閉按鈕),那么在計算尺寸和坐標的 時候就有兩種算法.包含 window frame 和 不包含 window frame. 其中x(),y0,frameGeometry(), pos(),move() 都是按照包含 window frame 的方式來計算 的. 其中 geome…

Nginx搭建API網關服務教程-系統架構優化 API統一管理

超實用&#xff01;用Nginx搭建API網關服務&#xff0c;讓你的系統架構更穩更強大&#xff01;&#x1f680; 親們&#xff0c;今天來給大家種草一個超級實用的API網關搭建方案啦&#xff01;&#x1f440; 在如今的Web系統架構中&#xff0c;一個穩定、高性能、可擴展的API網…

USB設備老是提示有問題,如何解決

問題描述&#xff1a;有一臺usb設備一旦不小心碰了下&#xff0c;后面就在右下角提示“無法識別的USB設備”“跟這臺計算機連接的前一個USB設備0工作不正常&#xff0c;WIndows無法識別它”。我這個是明確知道那個設備&#xff0c;如果不知道也可以同樣解決。 解決方法&#xf…

數據操作語言

一、DML的核心操作類型 1.添加數據(INSERT) (1)手動插入:逐行插入數據,適用于少量數據。 INSERT INTO 表名 (字段1, 字段2) VALUES (值1, 值2);(2)批量導入:通過外部文件導入數據,適用于大數據場景

【Python】案例:計算股票收益率和波動率

【Python】案例&#xff1a;計算股票收益率和波動率&#xff1a; 1、案例需求2、數據準備3、案例實現 1、案例需求 在分析股票數據時&#xff0c;我們需要從這些數據中得到一些關鍵指標進行評估&#xff0c;比如收益率、波動率&#xff0c;其中收益率又可以細分為簡單收益率和…

geoserver搭建Docker一鍵直接安裝并上傳tif影像預覽

geoserver搭建Docker一鍵直接安裝 文章目錄 geoserver搭建Docker一鍵直接安裝前言一、Docker拉取Geoserver二、運行后使用geoserver進行數據管理進入geoserver調整語言登錄geoserver上傳一個tif影像建立工作空間并上傳自己的tif數據建立圖層預覽 總結 前言 使用docker安裝geos…

STM32看門狗應用實戰:獨立看門狗與窗口看門狗深度解析(下) | 零基礎入門STM32第九十五步

主題內容教學目的/擴展視頻看門狗什么是看門狗&#xff0c;原理分析&#xff0c;啟動喂狗方法&#xff0c;讀標志位。熟悉在程序里用看門狗。 師從洋桃電子&#xff0c;杜洋老師 &#x1f4d1;文章目錄 一、看門狗應用架構分析1.1 系統監控流程圖1.2 雙看門狗應用場景對比 二、…

nacos集群啟動問題

根據您的描述&#xff0c;Nacos集群只能啟動兩個節點&#xff0c;可能的原因和解決方法如下&#xff1a; 1. 集群配置問題 ? 原因&#xff1a;cluster.conf文件中可能只配置了兩個節點的地址&#xff0c;導致第三個節點無法加入集群。 ? 解決方法&#xff1a; ? 檢查每個…

【C語言】跳臺階

相信你是最棒噠&#xff01;&#xff01;&#xff01; 一、題目描述 二、題目代碼 1.斐波那契數列 2.DFS深度搜索 總結 一、題目描述 一只青蛙一次可以跳上1級臺階&#xff0c;也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法&#xff08;先后次序不同算不同的結果…

指紋瀏覽器技術架構解析:高并發批量注冊業務的工程化實踐——基于分布式指紋引擎與防關聯策略的深度實現

一、技術背景與行業痛點 在跨境電商、廣告投放、問卷調查等場景中&#xff0c;批量注冊與多賬號矩陣運營已成為剛需。然而&#xff0c;主流平臺&#xff08;如亞馬遜、Facebook、Google&#xff09;的風控系統通過瀏覽器指紋追蹤&#xff08;Canvas/WebGL/WebRTC等&#xff09…

linux基礎操作

一、系統目錄知識 /bin&#xff1a; bin 是 Binaries (二進制文件) 的縮寫, 這個目錄存放著最經常使用的命令。 /boot&#xff1a; 這里存放的是啟動 Linux 時使用的一些核心文件&#xff0c;包括一些連接文件以及鏡像文件。 /dev &#xff1a; dev 是 Device(設備) 的縮寫,…

源碼分析之Leaflet圖層控制控件Control.Layers實現原理

概述 本文將介紹Leaflet庫中最后一個組件&#xff0c;即圖層控制組件 Control.Layers。 源碼實現 export var Layers Control.extend({options: {collapsed: true,position: "topright",autoZIndex: true,hideSingleBase: false,sortLayers: false,sortFunction:…

Element 使用 textarea 內容實現高度自適應

在 ElInput 組件的 type"textarea" 模式下&#xff0c;你可以使用 autosize 屬性來實現內容高度自適應。當沒有內容時默認顯示 3 行&#xff0c;當有內容時根據內容動態調整高度。 代碼&#xff1a; <el-form-item v-if"item.type textarea" :rules&…

Java技術生態前沿洞察:虛擬線程引領并發革命,框架創新賦能云原生時代

Java技術生態正迎來新一輪變革浪潮。虛擬線程的落地成為高并發編程范式轉折點&#xff0c;其極低資源開銷特性在電商秒殺場景中展現出3倍吞吐量提升&#xff0c;徹底改寫傳統線程模型性能邊界。Spring Boot 3.2原生支持虛擬線程&#xff0c;結合Observation API與HTTP客戶端優化…