03_意向鎖

意向鎖(Intention Lock)

文章目錄

    • 意向鎖(Intention Lock)
        • 簡介
        • 類型
        • 原理
        • 意向鎖加鎖流程
        • 鎖兼容矩陣
        • 使用場景
        • 示例
        • 總結
        • 擴展:意向鎖和共享鎖排他鎖的加鎖流程
          • 假設的場景和前提
          • 已加鎖的情況
          • 新的加鎖請求
          • 加鎖流程
          • 鎖的兼容性矩陣
          • 示例代碼
          • 總結

文章目錄

    • 意向鎖(Intention Lock)
        • 簡介
        • 類型
        • 原理
        • 意向鎖加鎖流程
        • 鎖兼容矩陣
        • 使用場景
        • 示例
        • 總結
        • 擴展:意向鎖和共享鎖排他鎖的加鎖流程
          • 假設的場景和前提
          • 已加鎖的情況
          • 新的加鎖請求
          • 加鎖流程
          • 鎖的兼容性矩陣
          • 示例代碼
          • 總結

簡介

MySQL 中的意向鎖(Intention Lock)是一種表級鎖,用于幫助協調不同粒度的鎖(行級鎖和表級鎖)之間的沖突,優化并發事務的鎖管理。意向鎖并不會實際阻止行的讀寫操作,而是用來表明事務接下來要在某些行上加鎖,從而提高鎖沖突檢測的效率。


類型

MySQL 中主要有兩種類型的意向鎖:

  1. 意向共享鎖(Intention Shared Lock, IS):事務計劃在某些行上加共享鎖。
  2. 意向排他鎖(Intention Exclusive Lock, IX):事務計劃在某些行上加排他鎖。

原理

當一個事務請求獲取一個行級鎖或表級鎖時,MySQL會自動獲取相應的表的意向鎖。 這樣,其他事務請求獲取表鎖時,就可以先基于這個意向鎖來發現是否有人加過鎖,并根據該鎖的類型(意向共享鎖/意向排他鎖)來判斷自己是否可以獲取鎖。通過這種方式,當一個事務請求表級鎖時,InnoDB 可以快速確定是否有任何行級鎖沖突,而無需檢查表中每一行的鎖狀態。

注意:

  • 意向鎖并不是直接鎖定資源,而是為了通知其他事務,以防止它們在資源上設置不兼容的鎖。
  • 意向鎖并不是直接由用戶請求的,而是由 MySQL 管理的。

意向鎖加鎖流程
  1. 事務請求意向鎖:事務發出加意向鎖的請求(IS或IX)。
  2. 檢查兼容性:MySQL 檢查意向鎖是否與當前表上的其他意向鎖或表級鎖兼容。如果兼容,則加鎖成功。
  3. 后續加鎖操作:事務在行級別上加共享鎖或排他鎖時,只需檢查意向鎖而無需檢查整個表。
  4. 釋放鎖:事務提交或回滾后,釋放意向鎖。

鎖兼容矩陣
ISIXSX
ISYesYesYesNo
IXYesYesNoNo
SYesNoYesNo
XNoNoNoNo
  • ISIS 是兼容的,可以同時存在。
  • ISIX 是兼容的,可以同時存在。
  • IXIX 是兼容的,可以同時存在。
  • SIS 是兼容的,可以同時存在。
  • SIX 以及 X 鎖都是不兼容的。

使用場景

意向鎖在以下場景中非常有用:

  • 高并發讀寫場景:在高并發讀寫操作中,意向鎖減少了鎖沖突檢測的開銷,提高了系統的并發性能。
  • 行級鎖與表級鎖混合使用:當事務需要在行級別加鎖但可能會有其他事務請求表級鎖時,意向鎖有助于快速檢測沖突。

示例

假設有一個表 orders,包含以下數據:

CREATE TABLE orders (id INT PRIMARY KEY,product_name VARCHAR(50),quantity INT
);
  1. 事務1

    START TRANSACTION;
    -- 請求在 orders 表上加意向排他鎖
    SELECT * FROM orders WHERE id = 1 FOR UPDATE;
    
  2. 事務2

    START TRANSACTION;
    -- 請求在 orders 表上加意向共享鎖
    SELECT * FROM orders WHERE id = 2 LOCK IN SHARE MODE;
    
  3. 事務3

    START TRANSACTION;
    -- 嘗試加表級共享鎖,會等待事務1和事務2釋放意向鎖
    LOCK TABLES orders READ;
    

在以上示例中:

  • 事務1在orders表上加了意向排他鎖(IX)和行級排他鎖(X)。
  • 事務2在orders表上加了意向共享鎖(IS)和行級共享鎖(S)。
  • 事務3嘗試加表級共享鎖(S),由于表上已有意向排他鎖(IX),因此會等待事務1釋放鎖。

總結

**意向鎖在 MySQL 中的作用是優化鎖管理,減少鎖沖突檢測的開銷,提升系統的并發性能。**它們在高并發讀寫場景和行級鎖與表級鎖混合使用場景中特別有用,通過表明事務的鎖意圖,使得鎖沖突檢測更加高效。

個人理解:

  • 意向鎖本質還是共享鎖和排它鎖
  • 根據 SQL 要添加共享鎖還是排它鎖,MySQL 自動添加意向共享鎖和意向排它鎖
  • 意向鎖是表級鎖,且是 MySQL的自動添加的,人為不可控。

擴展:意向鎖和共享鎖排他鎖的加鎖流程

在 MySQL 中,如果一個事務已經對 table 表的 id=1 記錄添加了行級排他鎖(A),而此時另一個事務要對同一個表的 id=5 記錄添加行級排他鎖(B),加鎖流程將涉及意向鎖和排他鎖的處理。以下是詳細的加鎖流程:

假設的場景和前提

假設表結構如下:

CREATE TABLE table (id INT PRIMARY KEY,value VARCHAR(50)
);
已加鎖的情況
  • 事務 A 已經對 id=1 的記錄添加了行級排他鎖(X 鎖)。
新的加鎖請求
  • 事務 B 嘗試對 id=5 的記錄添加行級排他鎖(X 鎖)。
加鎖流程
  1. 事務 B 請求意向排他鎖(IX 鎖)
    • 首先,事務 B 將在表 table 上嘗試加意向排他鎖(IX 鎖),以表明接下來會在某些行上加排他鎖。
  2. 檢查意向鎖的兼容性
    • 意向排他鎖(IX 鎖)與其他意向排他鎖(IX 鎖)和意向共享鎖(IS 鎖)都是兼容的,因此可以成功加鎖。
    • 意向排他鎖(IX 鎖)與表級共享鎖(S 鎖)和表級排他鎖(X 鎖)不兼容,但此處沒有表級鎖沖突。
  3. 請求行級排他鎖(X 鎖)
    • 事務 B 發出對 id=5 記錄加排他鎖(X 鎖)的請求。
    • MySQL 檢查行級鎖的兼容性。由于 id=5 的記錄當前沒有被其他事務加鎖,排他鎖(X 鎖)可以成功加鎖。(如果此時事務 B 對 id=1 添加行級鎖,那么事務 B 會被阻塞,直到事務 A 釋放了行級鎖)
  4. 加鎖成功
    • 事務 B 成功對 id=5 的記錄加上排他鎖(X 鎖)。
鎖的兼容性矩陣

為了更好地理解意向鎖和行級鎖的兼容性,以下是鎖的兼容性矩陣:

鎖類型ISIXSX
ISYesYesYesNo
IXYesYesNoNo
SYesNoYesNo
XNoNoNoNo
示例代碼

以下是一個具體示例代碼來說明上述流程:

  1. 事務 A

    START TRANSACTION;
    -- 對 id=1 的記錄加排他鎖
    SELECT * FROM table WHERE id = 1 FOR UPDATE;  -- 行級排他鎖 X
    
  2. 事務 B

    START TRANSACTION;
    -- 對 id=5 的記錄加排他鎖
    SELECT * FROM table WHERE id = 5 FOR UPDATE;  -- 行級排他鎖 X
    

在這個示例中:

  • 事務 A 對 id=1 的記錄加了排他鎖(X 鎖)。
  • 事務 B 對 id=5 的記錄加了排他鎖(X 鎖)。
總結
  1. 意向排他鎖(IX 鎖)
    • 事務 B 需要在表 table 上加意向排他鎖(IX 鎖)。由于 IX 鎖之間是兼容的,并且沒有表級別的鎖沖突,IX 鎖加鎖成功。
  2. 行級排他鎖(X 鎖)
    • 事務 B 對 id=5 的記錄加行級排他鎖(X 鎖),由于 id=5 沒有被其他事務鎖定,所以排他鎖加鎖成功。

這整個過程確保了即使在高并發環境下,事務之間能夠協調操作,避免數據沖突和不一致。通過意向鎖和行級鎖的配合,MySQL 能夠有效地管理并發事務對數據庫的訪問和操作。


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

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

相關文章

力扣算法-9.回文數

9.回文數 個人思考 首先從示例2可以看出符號也算在整數這個整體內,可以先判斷整數若為負數則返回false其次很容易就會想到遍歷兩次,從頭以及從尾,遍歷得到的結果相比較,相同則為回文數 public class Alee9 {public static void …

OpenResty的安裝及高級使用

OpenResty的安裝及高級使用 1. OpenResty的安裝1.1. 二進制版本安裝1.2. 源碼方式安裝2. 日志打印header和body3. 替換body體字符串1. OpenResty的安裝 OpenResty的中文站點:https://openresty.org/cn/ ?? OpenResty的英文站點:https://openresty.org/en/ 1.1. 二進制版本…

【linux基礎】后臺執行命令,防止中斷nohup

前臺運行與后臺運行:前臺運行,就是運行過程一直在屏幕輸出。 目的:1. 提交至后臺 & 2.防止中斷 nohup 1.終端上不要有大量的log出現,后臺運行 (1) & 程序后臺運行 #腳本、修改權限 vi test.sh chmod 777 test.sh#后…

ArcGIS Pro SDK (三)Addin控件 3 事件功能類

22 ArcGIS Pro 放置處理程序 目錄 22 ArcGIS Pro 放置處理程序22.1 添加控件22.2 Code 23 ArcGIS Pro 構造工具23.1 添加控件23.2 Code 24 ArcGIS Pro 表構造工具24.1 添加控件24.2 Code 22.1 添加控件 22.2 Code 放置處理程序可以實現文件拖動放置、TreeVIew、ListBox等控件拖…

極速安裝的藝術:使用 Mamba 革新你的 Conda 環境管理

標題:極速安裝的藝術:使用 Mamba 革新你的 Conda 環境管理 引言 在數據科學和機器學習領域,Conda 是一個廣受歡迎的包管理器和環境管理器。然而,隨著項目規模的增長,Conda 在處理大量依賴時可能會顯得緩慢。Mamba&am…

水下機器人ArduSub 固件常用參數

目前最新版的ArduSub 固件是4.1.2,本文的參數是基于這個版本的固件 SURFACE_DEPTH:水表深度讀數 當水下機器人在水面時,水壓傳感器將讀取的深度數據(以厘米為單位),這個相當于抵消零偏 單位:…

ArcGIS批量設置多圖層的三調地類符號

?? 點擊下方全系列課程學習 點擊學習—>ArcGIS全系列實戰視頻教程——9個單一課程組合系列直播回放 01需求說明 這次我們要實現的是將多個地類圖層批量符號化。比如將多個三調地類圖斑批量符號化。 ? 有什么好方法呢 ? 我們可以將一個圖層利用三調符號庫進行…

android 從應用中打開第三方應用

打開第三方應用之前需要先判斷該應用是否存在,代碼如下: public boolean isAppInstalled(Context context, String packageName) {PackageManager packageManager context.getPackageManager();try {packageManager.getPackageInfo(packageName, Packa…

Stable Diffusion 3 正式開源,超強文生圖模型 SD3-M 上線,趕緊來試試吧!

前言 我們都知道 Stable Diffusion 3 是一款強大的文生圖模型,擁有20億參數,因其高效的推理速度和卓越的生成效果而備受矚目。 近日,Stability AI在推特上宣布正式開源了 Stable Diffusion 3 Medium(SD3-M) 權重&…

Dooprime外匯:如何高效規劃家庭理財?從哪里開始?

摘要: 家庭理財是每個家庭都必須面對的重要課題。合理的理財規劃不僅能提高家庭的生活質量,還能為未來的生活提供保障。然而,許多人在面對復雜的理財選項和信息時感到無從下手。本文將從不同角度詳細分析如何進行高效的家庭理財規劃&#xf…

【Playwright+Python】手把手帶你寫一個自動化測試腳本

如何使用代理方式打開網頁 在 playwright.chromium.launch() 中傳入 proxy 參數即可,示例代碼如下: 1、同步寫法: from playwright.sync_api import sync_playwrightproxy {server: http:/127.0.0.1:8080}def run():with sync_playwright(…

Kafka精要

Apach Kafka 是一款分布式流處理框架,用于實時構建流處理應用。它有一個核心 的功能廣為人知,即 作為企業級的消息引擎被廣泛使用 kafka設計 Kafka 將消息以 topic 為單位進行歸納 將向 Kafka topic 發布消息的程序成為 producers. 將預訂 topics 并消…

Linux內核開發-編寫一個proc文件

0.前言 上一章(點擊返回上一章)完成了一個內核模塊的編寫,實現了在內核運行時的動態加載和卸載。 在模塊的開發調測過程中或者模塊運行過程中,可能需要打印內核模塊的變量的值或者想要動態開關模塊的運行日志打印,那么…

小盒子跑大模型!基于算能BM1684X+FPGA平臺實現大模型私有化部署

當前,在人工智能領域,大模型在豐富人工智能應用場景中扮演著重要的角色,經過不斷的探索,大模型進入到落地的階段。而大模型在落地過程中面臨兩大關鍵難題:對龐大計算資源的需求和對數據隱私與安全的考量。為應對這些挑…

springcloud-gateway include-expression 配置說明

在開發過程中遇到的一些配置問題,記錄下來以供參考 spring-gateway版本是2.2.9-release,使用的spring cloud dependence 是 Hoxton.SR12 在依賴eureka 服務發現并自動將發現服務器加入到router中的時候,需要指定對應的服務進行添加,根據文檔…

postman國內外競爭者及使用詳解分析

一、postman簡介 Postman 是一款廣泛使用的 API 開發和測試工具,適用于開發人員和測試人員。它提供了一個直觀的界面,用于發送 HTTP 請求、查看響應、創建和管理 API 測試用例,以及自動化 API 測試工作流程。以下是 Postman 的主要功能和特點…

linux的CP指令

實現 CP 指令 src 源文件 des 目標文件 執行流程: 打開源文件( src ) open 打開目標文件( des ) open 寫入目標文件 write 讀取 src 文件到緩存數組 read 關閉目標文件和源文件 close ./a.out src.c de…

開源網安參與編制的《代碼大模型安全風險防范能力要求及評估方法》正式發布

?代碼大模型在代碼生成、代碼翻譯、代碼補全、錯誤定位與修復、自動化測試等方面為研發人員帶來了極大便利的同時,也帶來了對安全風險防范能力的挑戰。基于此,中國信通院依托中國人工智能產業發展聯盟(AIIA),聯合開源…

chmod,chown命令

一.chmod命令 1.chmod命令的作用 我們使用chmod命令來修改文件和文件夾的權限信息(只有文件和文件夾的所屬用戶和root用戶可以修改該文件或文件夾的權限信息) 2.chmod命令的語法 chmod [-R] 我們將要賦予用戶/用戶組/其他用戶的權限 要修改的文件/文件…

SpringBoot實現定時任務的動態停止和更新

目錄 定時任務管理器定時任務的任務接口定時任務和定時任務結果的緩存對象定時任務使用姿勢 定時任務管理器 負責啟動一個定時任務、停止一個定時任務、更新一個定時任務 /*** 定時任務管理器* 1、創建并啟動一個定時任務* 2、停止一個定時任務* 3、更新一個定時任務*/ publi…