【并發編程】MySQL鎖及單機鎖實現

目錄

一、MySQL鎖機制

1.1 按鎖粒度劃分

1.2 按鎖功能劃分

1.3 InnoDB鎖實現機制

(1)記錄鎖(Record Lock)

(2) 間隙鎖(Gap Lock)

(3) 臨鍵鎖(Next-Key Lock)

(4) 插入意向鎖(Insert Intention Lock)

二、基于 JVM 本地鎖實現,保證線程安全

2.1 線程不安全的分析

2.1.1 多線程并發訪問(未加鎖)

2.2 基于 synchronized 加鎖訪問

2.3 基于 synchronized 加鎖訪問

2.4 JVM 本地鎖的缺陷

三、基于 MySQL 鎖實現,保證線程安全問題

3.1 基于原子 SQL 實現

3.2 基于悲觀鎖實現(靈活多 SQL )

3.2.1 原生 SQL 實現

3.2.2 Java 代碼實現

3.2.3 悲觀鎖優缺點

3.2.4 死鎖演示

3.3 基于樂觀鎖實現(CAS)

3.3.1 原生SQL實現

3.3.2 Java 代碼實現

3.3.3 樂觀鎖存在的問題

四、本地不同類型鎖的總結


一、MySQL鎖機制

1.1 按鎖粒度劃分

  • 表級鎖?:鎖定整張表

    • 優點:開銷小,加鎖快
    • 缺點:并發度低
    • 實現:LOCK TABLES語句或存儲引擎自動加鎖
  • ?行級鎖?:鎖定單行記錄

    • 優點:并發度高
    • 缺點:開銷大,加鎖慢
    • 實現:InnoDB通過索引實現
  • ?頁級鎖?:鎖定一頁(16KB)

    • 折中方案,BDB引擎使用

1.2 按鎖功能劃分

  • ?共享鎖(S鎖)??:

    • 語法:SELECT ... LOCK IN SHARE MODE
    • 特性:多個事務可同時獲取,但不能與排他鎖共存
  • ?排他鎖(X鎖)??:

    • 語法:SELECT ... FOR UPDATE
    • 特性:獨占鎖,其他事務不能獲取任何鎖
  • ?意向鎖(Intention Lock)??:

    • 表級鎖,表示事務將要獲取行鎖
    • IS鎖(意向共享鎖):事務準備給行加S鎖
    • IX鎖(意向排他鎖):事務準備給行加X鎖

1.3 InnoDB鎖實現機制

(1)記錄鎖(Record Lock)
  • 鎖定索引中的單條記錄
  • 實現方式:通過索引項加鎖
(2) 間隙鎖(Gap Lock)
  • 鎖定索引記錄間的間隙
  • 防止幻讀問題
  • 示例:SELECT * FROM t WHERE id > 10 AND id < 20 FOR UPDATE
(3) 臨鍵鎖(Next-Key Lock)
  • 記錄鎖+間隙鎖的組合
  • 鎖定記錄及記錄前的間隙
  • InnoDB默認行鎖算法
(4) 插入意向鎖(Insert Intention Lock)
  • 特殊的間隙鎖
  • 多個事務在相同間隙插入不同記錄時不沖突

二、基于 JVM 本地鎖實現,保證線程安全

2.1 線程不安全的分析

多線程環境下多個線程(并發用戶訪問)訪問同一個共享資源,并對資源進行修改(觸發了線程安全問題)。

接下來只關注 Service 層的邏輯實現

2.1.1 多線程并發訪問(未加鎖)

1. 創建多線程環境下生產級減庫存案例

@Service
public class StockService {private Stock stock = new Stock();public void deduct(){stock.setStock(stock.getStock()-1);System.out.println("扣減成功,剩余庫存:"+stock.getStock());}
}

2. 運行項目,通過 JMeter 進行并發測試

查看聚合報告,樣本數量為 5000 次,吞吐量為 1900個事務/秒 左右。

3. 查看項目日志:發生超賣現象。

此時查看 MySQL 表中的 1001 商品編號的第一條記錄,校驗庫存數量是否為0:

2.2 基于 synchronized 加鎖訪問

1. 修改減庫存的方法,進行加鎖操作:synchronized 直接修改方法(底層是基于 Monitor 實現)

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

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

相關文章

能耗優化新引擎:EIOT平臺助力企業降本增效

安科瑞顧強 數字化轉型的背景下&#xff0c;能源管理正加速向智能化、遠程化方向演進。安科瑞電氣推出的EIOT托管平臺及ADW300系列4G無線計量儀表&#xff0c;通過云端技術與無線通信的深度融合&#xff0c;為用戶打造了高效、便捷的遠程能源監測與管理體系&#xff0c;助力企…

(14)Element Plus項目綜合案例

本系列教程目錄&#xff1a;Vue3Element Plus全套學習筆記-目錄大綱 文章目錄 第3章 綜合案例3.1 搭建項目3.1.1 創建Vite工程3.1.2 配置路由 3.2 登錄模塊頁面3.2.1 注冊頁面3.2.2 登錄頁面3.2.3 忘記密碼頁面 3.3 導航設置3.3.1 頭部3.3.2 側邊欄與底部1&#xff09;頭像部分…

Webug4.0靶場通關筆記22- 第27關文件包含

目錄 一、文件包含 1、原理分析 2、文件包含函數 &#xff08;1&#xff09;include( ) &#xff08;2&#xff09;include_once( ) &#xff08;3&#xff09;require( ) &#xff08;4&#xff09;require_once( ) 二、第27關滲透實戰 1、打開靶場 2、源碼分析 3、…

〖 Linux 〗解決 VS Code 遠程連接服務器的常見問題

文章目錄 解決 VS Code 遠程連接服務器的斷開問題VS Code Remote-SSH一直彈出輸入密碼的問題VsCode C 語法檢測失效不標紅色波浪線 解決辦法卸載擴展方式&#xff1a; 解決vscode C智能提示緩慢 解決 VS Code 遠程連接服務器的斷開問題 解決 vscode 卡頓&#xff0c;卡死&…

ERC-20與ERC-721:區塊鏈代幣標準的雙星解析

一、代幣標準的誕生背景 在以太坊生態中&#xff0c;代幣標準是構建去中心化應用&#xff08;DApps&#xff09;的基石。ERC-20與ERC-721分別代表同質化與非同質化代幣的兩大核心標準&#xff0c;前者支撐著90%以上的加密資產流通&#xff0c;后者則開啟了數字資產唯一性的新時…

C++入門小館 :多態

嘿&#xff0c;各位技術潮人&#xff01;好久不見甚是想念。生活就像一場奇妙冒險&#xff0c;而編程就是那把超酷的萬能鑰匙。此刻&#xff0c;陽光灑在鍵盤上&#xff0c;靈感在指尖跳躍&#xff0c;讓我們拋開一切束縛&#xff0c;給平淡日子加點料&#xff0c;注入滿滿的pa…

【NextPilot日志移植】整體功能概要

整體日志系統的實現功能 該日志系統主要實現了飛行日志的記錄功能&#xff0c;支持多種日志記錄模式&#xff0c;可將日志存儲到文件或通過 MAVLink 協議傳輸&#xff0c;同時具備日志加密、空間管理、事件記錄等功能。具體如下&#xff1a; 日志記錄模式&#xff1a;支持按武…

數字化轉型:概念性名詞淺談(第二十五講)

大家好&#xff0c;今天接著介紹數字化轉型的概念性名詞系列。 &#xff08;1&#xff09;SOP(標準作業程序) 標準作業程序&#xff08;Standard Operating Procedure, SOPs&#xff09;是在有限時間與資源內&#xff0c;為了執行復雜的日常事務所設計的內部程序。從管理學的…

交叉編譯 opencv-4.10

編譯說明 opencv 下包含很多模塊&#xff0c;各個模塊的作用可以參考Opencv—模塊概覽. 嵌入式考慮有限存儲等因素會對模塊進行裁剪&#xff0c;我這里主要保留圖像拼接&#xff08;stitching&#xff09;圖片編解碼&#xff08;imgcodecs&#xff09;與特征點匹配&#xff08…

Python cv2對象檢測與跟蹤:從基礎到進階實戰

在計算機視覺領域&#xff0c;對象檢測&#xff08;定位目標位置&#xff09;與對象跟蹤&#xff08;持續追蹤目標運動&#xff09;是視頻分析、自動駕駛、智能監控等應用的核心技術。本文將結合OpenCV的cv2庫&#xff0c;系統講解其原理與Python實現方法。 一、對象檢測 vs 對…

亞馬遜推出新型倉儲機器人 Vulcan:具備“觸覺”但不會取代人類工人

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

緩存套餐-03.功能測試

一.功能測試 點擊小程序&#xff0c;就會觸發根據分類id查詢套餐方法&#xff0c;根據分類id查詢套餐。 第一次查詢&#xff0c;redis中沒有數據&#xff0c;就會發sql進行sql數據庫查詢。 redis當中就有了對應的緩存。 再次點擊&#xff0c;發現sql根本沒有執行&#xff0c;…

WebFlux與HttpStreamable關系解析

1-Streamable 1-WebFlux與HttpStreamable關系解析2-MCP協議Streamable HTTP 2-參考網址 MCP協議Streamable HTTPMCP協議重大升級&#xff0c;Spring AI Alibaba聯合Higress發布業界首個Streamable HTTP實現方案 3-WebFlux與HttpStreamable關系解析 WebFlux 和 HttpStreamabl…

順豐科技:從 Presto 到 Doris 湖倉構架升級,提速 3 倍,降本 48%

導讀&#xff1a;順豐科技引入 Doris 替換 Presto&#xff0c;在內部可視化數據自助分析工具豐景臺場景廣泛應用。目前&#xff0c;順豐臨時查詢業務、豐景臺報表業務的 Presto 場景已經 100% 切換到 Doris 集群中&#xff0c;日均查詢量 100W。并實現 P95 性能提升近 3 倍&…

如何在Jmeter中調用C程序?

在JMeter中調用C語言程序可以通過以下幾種方式實現&#xff1a; 方法一&#xff1a;使用OS Process Sampler JMeter的“OS Process Sampler”可以用來調用外部程序&#xff0c;包括C語言編寫的可執行文件。 步驟&#xff1a; 準備C語言程序&#xff1a; 編寫C語言代碼并編譯…

python 中的單例

在 Python 里&#xff0c;單例模式指的是一個類僅有一個實例&#xff0c;并且提供一個全局訪問點來獲取該實例。下面為你介紹幾種實現單例模式的常見方法。 1. 使用模塊 在 Python 里&#xff0c;模塊天然就是單例模式。當模塊被導入時&#xff0c;Python 會對其進行一次加載…

Linux58 ssh服務配置 jumpserver 測試雙網卡 為何不能ping通ip地址

判斷為NAT模式網卡 能ping 通外網 ens34為僅主機模式網卡 [rootlocalhost network-scripts]# ip route show default default via 10.1.1.254 dev ens33 proto static metric 100 10.0.0.0/8 dev ens33 proto kernel scope link src 10.1.1.37 metric 100 11.0.0.0/8 dev…

web 自動化之 selenium+webdriver 環境搭建及原理講解

文章目錄 一、web 自動化測試學習說明二、什么 web 自動化測試三、selenium 簡介四、web自動化測試環境搭建五、web 自動化測試第一個腳本六、selenium 原理及源碼講解 一、web 自動化測試學習說明 進階 web 自動化測試學習&#xff1a;掌握 python 編程基礎 二、什么 web 自…

Linux 網絡命名空間:從內核資源管理到容器網絡隔離

1. 網絡命名空間是什么? 網絡命名空間(Network Namespace) 是 Linux 內核提供的一種網絡資源隔離機制,用于為進程或容器創建完全獨立的網絡環境。它并非物理或虛擬的網絡接口(如網卡、veth pair 等),而是一個虛擬容器,包含以下資源的獨立實例: 網絡接口(物理或虛擬)…

SQL知識點總結

總結的知識點主要來源于前段時間在牛客刷SQL題目中遇到的錯誤 目錄 1.WHERE字句不能與高級函數連用 2.去重——distinct 3.不等于某個值 4.查多個范圍內的值 5. 升/降序排序 6.占位符 7.統計某類別總數計算平均值 8.合并查詢——UNION &#xff08;ALL&#xff09; 9…