MySQL鎖(一) 概述與分類

1.1 MySQL鎖的由來

客戶端發往 MySQL 的一條條 SQL 語句,實際上都可以理解成一個個單獨的事務(一條sql語句默認就是一個事務)。而事務是基于數據庫連接的,每個數據庫連接在 MySQL 中,又會用一條工作線程來維護,也意味著一個事務的執行,本質上就是一條工作線程在執行,當出現多個事務同時執行時,這種情況則被稱之為并發事務,所謂的并發事務也就是指多條線程并發執行。

多線程并發執行自然就會出問題,也就是事務中的臟寫、臟讀、不可重復讀及幻讀問題。而對于這些問題又可以通過調整事務的隔離級別來避免,那為什么調整事務的隔離級別后能避免這些問題產生呢?這是因為不同的隔離級別中,工作線程執行SQL語句時,用的鎖粒度、類型不同。

1.2 鎖定義

由以上可知,數據庫的鎖機制本身是為了解決并發事務帶來的問題而誕生的,主要是確保數據庫中,多條工作線程并行執行時的數據安全性。

鎖是計算機協調多個進程或線程并發訪問某一資源的機制。在數據庫中,除傳統的計算資源(CPU、RAM、I/O)的爭用以外,數據也是一種供許多用戶共享的資源。如何保證數據并發訪問的一致性、有效性是所有數據庫必須解決的一個問題,鎖沖突也是影響數據庫并發訪問性能的一個重要因素。從這個角度來說,鎖對數據庫而言顯得尤其重要,也更加復雜。

1.3 鎖分類

MySQL的鎖機制與索引機制類似,都是由存儲引擎負責實現的,這也就意味著不同的存儲引擎,支持的鎖也并不同,這里是指不同的引擎實現的鎖粒度不同。但除開從鎖粒度來劃分鎖之外,其實鎖也可以從其他的維度來劃分,因此也會造出很多關于鎖的名詞,下面先簡單梳理一下MySQL的鎖體系:

  • 以鎖粒度的維度劃分

    • 全局鎖:鎖定數據庫中的所有表。加上全局鎖之后,整個數據庫只能允許讀,不允許做任何寫操作

    • 表級鎖:每次操作鎖住整張表。主要分為三類

      • 表鎖(分為表共享讀鎖 read lock、表獨占寫鎖 write lock)
      • 元數據鎖(meta data lock,MDL):基于表的元數據加鎖,加鎖后整張表不允許其他事務操作。這里的元數據可以簡單理解為一張表的表結構
      • 意向鎖(分為意向共享鎖、意向排他鎖):這個是InnoDB中為了支持多粒度的鎖,為了兼容行鎖、表鎖而設計的,使得表鎖不用檢查每行數據是否加鎖,使用意向鎖來減少表鎖的檢查
    • 行級鎖:每次操作鎖住對應的行數據。主要分為三類

      • 記錄鎖 / Record 鎖:也就是行鎖,一條記錄和一行數據是同一個意思。防止其他事務對此行進行update和delete,在 RC、RR隔離級別下都支持
      • 間隙鎖 / Gap 鎖:鎖定索引記錄間隙(不含該記錄),確保索引記錄間隙不變,防止其他事務在這個間隙進行insert,產生幻讀。在RR隔離級別下都支持
      • 臨鍵鎖 / Next-Key 鎖:間隙鎖的升級版,同時具備記錄鎖+間隙鎖的功能,在RR隔離級別下支持
  • 以互斥性的角度劃分

    • 共享鎖 / S鎖:不同事務之間不會相互排斥、可以同時獲取的鎖
    • 排他鎖 / X鎖:不同事務之間會相互排斥、同時只能允許一個事務獲取的鎖
    • 共享排他鎖 / SX鎖:MySQL5.7版本中新引入的鎖,主要是解決SMO帶來的問題
  • 以操作類型的維度劃分

    • 讀鎖:查詢數據時使用的鎖
    • 寫鎖:執行插入、刪除、修改、DDL語句時使用的鎖
  • 以加鎖方式的維度劃分

    • 顯示鎖:編寫SQL語句時,手動指定加鎖的粒度
    • 隱式鎖:執行SQL語句時,根據隔離級別自動為SQL操作加鎖
  • 以思想的維度劃分

    • 樂觀鎖:每次執行前認為自己會成功,因此先嘗試執行,失敗時再獲取鎖
    • 悲觀鎖:每次執行前都認為自己無法成功,因此會先獲取鎖,然后再執行

放眼望下來,是不是看著還蠻多的,但總歸說來說去其實就共享鎖、排他鎖兩種,只是加的方式不同、加的地方不同,因此就演化出了這么多鎖的稱呼。

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

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

相關文章

PyTorch里的張量及張量的操作

張量的簡介 張量是多重線性映射在給定基下的坐標表示,可視為向量和矩陣的泛化。 0 維張量:標量(如 5)1 維張量:向量(如 [1, 2, 3])2 維張量:矩陣(如 [[1, 2], [3, 4]]&…

向量數據庫Faiss vs Qdrant全面對比

Faiss vs Qdrant 全面對比表 向量數據庫是一種相對較新的方式,用于與來自不透明機器學習模型(如深度學習架構)派生的抽象數據表示進行交互。這些表示通常被稱為向量或嵌入(embeddings),它們是用于訓練機器學習模型完成諸如情感分析、語音識別、目標檢測等任務的數據的壓…

2025年AIR SCI1區TOP,縮減因子分數階蜣螂優化算法FORDBO,深度解析+性能實測

目錄1.摘要2.蜣螂優化算法DBO原理3.改進策略4.結果展示5.參考文獻6.代碼獲取7.算法輔導應用定制讀者交流1.摘要 傳統DBO存在探索與開發能力失衡、求解精度低以及易陷入局部最優等問題。因此,本文提出了帶有縮減因子分數階蜣螂優化算法(FORDBO&#xff0…

爬蟲逆向之JS混淆案例(全國招標公告公示搜索引擎 type__1017逆向)

案例https://ctbpsp.com/#/ 截至2025.07.19可用 定位加密位置 加密位置: 定位方式,XHR,跟棧 跟棧 QL打斷點,重新斷住 分析為,一個函數傳入四個參數 var QL QI[d9(Nv.mQ)](QJ, Qh, Qv, this[d9(Nv.m9)][0xa1a * …

Hive常用命令總結

一、數據庫操作 -- 創建數據庫(默認路徑) CREATE DATABASE IF NOT EXISTS myhive;-- 指定路徑創建數據庫 CREATE DATABASE myhive2 LOCATION /myhive2;-- 查看數據庫信息 DESC DATABASE myhive;-- 刪除數據庫(強制刪除表) DROP DA…

Spring整合MyBatis詳解

Spring整合MyBatis詳解一、整合優勢與核心思路1.1 整合優勢1.2 核心整合思路二、環境搭建與依賴配置2.1 開發環境2.2 Maven依賴配置三、整合配置(核心步驟)3.1 數據庫配置文件(db.properties)3.2 Spring配置文件(sprin…

Windows CMD(命令提示符)中最常用的命令匯總和實戰示例

CMD命令匯總 下面是 Windows CMD(命令提示符)中最常用的命令匯總,共 30 個,包含說明和典型代碼示例,適合日常開發、系統操作、文件管理、網絡診斷等場景。一、文件與目錄操作(最常用)命令說明示…

嵌入式硬件篇---舵機(示波器)

舵機是一種高精度的角度控制執行器件,廣泛應用于機器人、航模、自動化設備等領域。其核心特點是能通過控制信號精準定位到特定角度(通常范圍為 0-180,部分可到 360 連續旋轉)。常見的舵機類型可根據結構、控制方式、用途等維度劃分…

嵌入式硬件篇---按鍵

按鍵是電子系統中最基礎的人機交互部件,通過機械或電子方式實現電路通斷或狀態切換。根據結構和工作原理的不同,常見按鍵可分為機械按鍵、薄膜按鍵、觸摸按鍵等,以下詳細介紹其工作原理、應用場景及電路特點:一、機械按鍵&#xf…

試用SAP BTP 06:AI服務-Data Attribute Recommendation

創建實例 方法一:BTP主控室-子賬戶-服務市場 輸入實例配置信息,下一步 不用參數,下一步 審核實例,點擊創建 實例創建完成后,創建服務鍵值 輸入鍵值名稱,點擊 創建 方法二(建議)&…

訓詁學中的“形音義互求”對NLP、知識圖譜、注意力機制的啟示

一、訓詁學與現代人工智能結合的學術價值與技術潛力1. ??訓詁學的核心優勢與AI語義分析的契合點??訓詁學作為中國傳統學術中研究古代文獻語義的核心學科,其方法論和理論框架對自然語言處理(NLP)的深層語義分析具有深刻的啟發性和技術補充…

http基礎一

1. HTTP是什么? HTTP(超文本傳輸協議,HyperText Transfer Protocol)是一種用于從萬維網服務器傳輸超文本到本地瀏覽器的協議。它是無狀態的客戶端-服務器協議,通常在Web瀏覽器和Web服務器之間用于傳輸網頁、圖片、視頻…

西門子 S7-1500 系列 PLC CPU 選型全指南:從類型到實戰

在西門子 S7-1500 系列 PLC 的系統構建中,CPU 作為核心控制單元,其選型直接決定了自動化系統的性能、功能擴展性和適用場景。本文將系統解析 S7-1500 系列 CPU 的類型劃分、核心參數、典型型號功能及選型流程,助你精準匹配工業控制需求。一、…

PaddleOCR 與 PaddleX 調試

PaddleOCR 與 PaddleX 調試1.安裝1.1 環境準備1.2用Conda創建虛擬環境2.測試2.1發票測試2.2 手寫漢字識別3.PaddleOCR 與 PaddleX 對比3.1 基于 PaddleX 部署 OCR 服務1.安裝 PP OCR 文檔 1.1 環境準備 根據自己操作系統按網上指導安裝 ccache ccache --version是否已安裝 …

imx6ull-系統移植篇11——U-Boot 移植(下)

目錄 前言 移植過程 添加開發板默認配置文件 添加開發板對應的頭文件 添加開發板對應的板級文件夾 修改Makefile 文件 修改imximage.cfg 文件 修改Kconfig 文件 修改MAINTAINERS 文件 修改 U-Boot 圖形界面配置文件 編譯 uboot LCD 驅動修改 修改源文件 修改頭文…

30天打牢數模基礎-模擬退火算法講解

二、完整Python代碼 import random import mathdef rastrigin(x, y):"""二維Rastrigin函數(目標函數,需最小化)參數:x: 自變量xy: 自變量y返回:函數值f(x,y)"""return 20 x**2 y**2 …

論文閱讀 - FastInst

文章目錄1 概述2 模型說明2.1 總體架構2.2 輕量pixel decoder2.3 實例激活引導的Query2.4 雙路徑更新策略2.5 GT掩碼引導學習2.6 損失函數3 效果1 概述 FastInst是一種基于query的實時實例分割方法,它能以32.5FPS的實時速度在COCO測試集上達到40.5的AP。在實例分割…

Elasticsearch 9.x 高可用集群部署教程(3 主節點 + 3 數據節點)

Elasticsearch 9.x 高可用集群部署教程(3 主節點 + 3 數據節點) 1. 集群架構規劃 生產環境中的 Elasticsearch 集群需要高可用性和容錯能力。以下是基于 3 主節點 + 3 數據節點的架構規劃: 節點分布: 主節點(Master Nodes):3 臺(master-node-1, master-node-2, maste…

Unity_通過鼠標點擊屏幕移動屏幕里的一個對象

文章目錄一、獲取到點擊物體的Tansform(摁下鼠標左鍵的瞬間)二、移動點擊的物體(摁著鼠標左鍵不放)三、松開左鍵清理被移動對象屬性總結注:本文章只是學習總結的筆記,視頻鏈接 一、獲取到點擊物體的Tansfor…

UDP中的單播,多播,廣播(代碼實現)

文章目錄1. UDP 單播(Unicast)示例2. UDP 廣播(Broadcast)示例3. UDP 多播(Multicast)示例3.1 多播發送方示例3.2 多播接收方示例總結1. UDP 單播(Unicast)示例 發送方向指定單個目…