一文詳解mysql 的鎖

MySQL鎖是用于管理數據庫中的并發操作的一種機制,它可以確保數據的一致性和完整性。
按范圍劃分:包括全局鎖、表級鎖、頁級鎖和行級鎖。
按類型劃分:包括間隙鎖、臨鍵鎖和記錄鎖。
按級別劃分:包括共享鎖(S鎖)和排它鎖(X鎖),以及意向鎖。

全局鎖

全局鎖是MySQL中鎖的一種粒度,它影響的是整個數據庫實例。當施加全局鎖時,數據庫中的所有表都無法進行寫操作,即所有的數據更新語句(增刪改)和數據定義語句(如創建、修改、刪除表結構等)都會被阻塞。

典型的使用場景是在執行全庫邏輯備份時,通過施加全局鎖來確保數據的一致性,從而防止備份過程中的數據不一致問題。這對于保證備份數據的完整性和準確性非常關鍵。

-- 施加全局讀鎖(共享鎖)
FLUSH TABLES WITH READ LOCK;-- 執行備份操作...-- 釋放全局讀鎖
UNLOCK TABLES;

表級鎖

每次操作鎖住整張表。開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖沖突的概率最高,并發度最低;一般用在整表數據遷移的場景。

手動增加表鎖:

lock table 表名稱 read(write),表名稱2 read(write);

例如lock tables t1 read, t2 write; 命令,則其他線程寫 t1、讀寫 t2 的語句都會被阻塞。同時,線程 A 在執行 unlock tables 之前,也只能執行讀 t1、讀寫 t2 的操作。連寫 t1 都不允許,自然也不能在unlock tables之前訪問其他表。
查看表上加過的鎖:

show open tables;

刪除表鎖:

unlock tables;

頁級鎖

頁級鎖的鎖定粒度和加鎖時間介于表級鎖和行級鎖之間,適用于對相鄰一組記錄的操作。
以下是頁級鎖的示例:

-- 開啟事務
START TRANSACTION;-- 執行查詢操作,并使用LOCK IN SHARE MODE對結果集進行共享鎖定
SELECT * FROM table_name WHERE condition LOCK IN SHARE MODE;-- 執行更新操作,并使用FOR UPDATE對結果集進行排他鎖定
UPDATE table_name SET column1 = value1, column2 = value2 WHERE condition FOR UPDATE;-- 提交事務
COMMIT;

SELECT … LOCK IN SHARE MODE語句會將查詢結果集進行共享鎖定,允許其他事務讀取該結果集,但不允許對其進行修改。而UPDATE … FOR UPDATE語句則會將更新的結果集進行排他鎖定,防止其他事務對該結果集進行讀取或修改。

行鎖

每次操作鎖住一行數據。鎖定粒度最小,發生鎖沖突的概率最低,并發度最高,但是加鎖慢、開銷大,容易發生死鎖現象。
InnoDB與MYISAM的最大不同有兩點:

  • InnoDB支持事務
  • InnoDB支持行級鎖

InnoDB在執行查詢語句SELECT時(非串行隔離級別),不會加鎖。但是update、insert、delete操作會加行鎖。

共享鎖和排他鎖

  • 讀鎖/共享鎖(Shared Lock,S鎖):針對同一份數據,多個事務的讀操作可以同時進行而不會互相影響,相互不阻塞的。

  • 寫鎖/排它鎖(Exclusive Lock,X鎖):允許事務對某些數據進行刪除或更新。如果當前操作還沒完成,其他事務的S和X鎖是會被阻塞的,確保在多個事務中,對同一資源,只有一個事務能寫入,并防止其他用戶讀取正在寫入的資源。

S鎖X鎖
S鎖兼容不兼容
X鎖不兼容不兼容

共享鎖稱為讀鎖,但不是讀一定獲取共享鎖。正常情況下,select某一條記錄時,只需要獲取該記錄的共享鎖。但是,在有些情況下可能select記錄時就獲取記錄的排他鎖,來禁止別的事務來讀取該記錄,為此,MySQL提供了兩種特殊的select語句:
對讀取的記錄加S鎖:

SELECT... LOCK IN SHARE MODE; SELECT ... FOR SHARE [NOWAIT|SKIP LOCKED];-- 8.0特性
——NOWAIT表示不等待直接報錯,
——SKIP LOCKED表示立即返回,但返回的結果不包含被鎖定的行

此時允許其他事務讀取該記錄(給該記錄加S鎖),但是不允許其他事物給該記錄加X鎖,需要阻塞等待當前事務提交后獲取鎖。

對讀寫的記錄加X鎖:

select * from user where id=1 for update;

如果當前事務中有該語句,會給記錄增加X鎖,不允許其他事務獲取該記錄的S鎖和X鎖。

意向鎖

意向鎖的作用就是加快表鎖的檢查過程。
意向鎖是由存儲引擎自己維護的,用戶無法手動獲取,在為數據行加共享/排他鎖之前,InooDB會先獲取該數據所在表的對應意向鎖。

  • 意向共享鎖(intention shared lock,IS)
    在使用InnoDB引擎的表里對某些記錄加上「共享鎖」之前,需要先在表級別加上一個「意向共享鎖」:
——事務要獲取某些行的S鎖,必須先獲得表的 IS 鎖。
SFLFCT column FROM table ... LOCK IN SHARE MODE;
  • 意向排他鎖(intention exclusive lock,IX)
    在使用InnoDB引擎的表里對某些紀錄加上「獨占鎖」之前,需要先在表級別加上一個「意向獨占鎖」:
——事務要獲取某些行的X鎖,必須先獲得表的IX鎖。
SELECT column FROM table ... FOR UPDATE; 

間隙鎖

間隙鎖的作用是防止其他事務在當前事務未提交的情況下插入新的記錄,從而避免幻讀現象的發生。當一個事務執行了范圍查詢操作時,MySQL會自動為該范圍加上間隙鎖,以防止其他事務在該范圍內插入新的記錄。

需要注意的是,間隙鎖的加鎖范圍是左開右閉區間,即不包括范圍的左右端點。例如,如果一個事務執行了以下范圍查詢操作:

SELECT * FROM table_name WHERE column > 10 AND column < 20;

那么MySQL會為該范圍加上間隙鎖,鎖定從10到20之間的所有記錄,但不包括10和20這兩個值本身。

臨鍵鎖(Next-key Locks)

臨鍵鎖,是記錄鎖與間隙鎖的組合,它的封鎖范圍,既包含索引記錄,又包含索引區間,是一個左開右閉區間。臨鍵鎖的主要目的,也是為了避免幻讀(Phantom Read)。如果把事務的隔離級別降級為RC,臨鍵鎖則也會失效。
每個數據行上的非唯一索引列上都會存在一把臨鍵鎖,當某個事務持有該數據行的臨鍵鎖時,會鎖住一段左開右閉區間的數據。需要強調的一點是,InnoDB 中行級鎖是基于索引實現的,臨鍵鎖只與非唯一索引列有關,在唯一索引列(包括主鍵列)上不存在臨鍵鎖。
Next-Key Locks是行鎖與間隙鎖的組合。像上面那個例子里的這個(3,20]的整個區間可以叫做臨鍵鎖。

記錄鎖

記錄鎖也叫行鎖,例如:

select * from emp where empno = 1 for update;

它會在 id=1 的記錄上加上記錄鎖,以阻止其他事務插入,更新,刪除 id=1 這一行。

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

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

相關文章

如何在Windows輕量應用服務器上安裝和配置SSH?

如何在Windows輕量應用服務器上安裝和配置SSH&#xff1f; 檢查OpenSSH的可用性&#xff1a;首先&#xff0c;需要以管理員身份打開PowerShell并運行命令Get-WindowsCapability - Online | Where-Object Name - like OpenSSH*來檢查OpenSSH服務是否可用。如果服務未啟動或不可…

day03_Vue_Element

文章目錄 01.Ajax1.1 Ajax 概述1.2 同步異步1.3 原生Ajax 2. Axios2.1 Axios的基本使用2.2 Axios快速入門2.3請求方法的別名2.4 案例 3 前后臺分離開發3.1 前后臺分離開發介紹 04 YAPI4.1 YAPI介紹4.2 接口文檔管理 05 前端工程化5.1 前端工程化介紹5.2 前端工程化入門5.2.1 環…

【Python】變量的引用

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介紹&#xff1a;"謓澤"正在路上朝著"攻城獅"方向"前進四" &#x1f50e;&#x1f3c5; 榮譽&#xff1a;2021|2022年度博客之星物聯網與嵌入式開發TOP5|TOP4、2021|2222年獲評…

2024.3.4 作業

1、流式域套接字 1>tcp服務端實現 #include<myhead.h> int main(int argc, const char *argv[]) {//1、創建套接字int sfd socket(AF_UNIX, SOCK_STREAM, 0);if(sfd -1){perror("socket error");return -1;}//2、判斷套接字文件是否存在&#xff0c;如果…

5G工業智能網關保障煤礦安全生產

隨著物聯網技術發展與煤礦需求的持續激增&#xff0c;礦山礦井的分布范圍廣泛、戶外環境惡劣等管理問題急需解決&#xff0c;而物聯網網關工業級設計能夠無懼惡劣環境干擾&#xff0c;輕松解決戶外網絡部署問題。 工業網關通過采集礦井內的各類傳感器數據對礦井進行遠程監控&a…

MySQL中的大表優化方案

當MySQL單表記錄數過大時&#xff0c;數據庫的CRUD性能會明顯下降&#xff0c;一些常見的優化措施如下&#xff1a; 1&#xff1a;限定數據的范圍 務必禁止不帶任何限制數據范圍條件的查詢語句。比如&#xff1a;我們當用戶在查詢訂單歷史的時候&#xff0c;我們可以控制在一個…

【NR 定位】3GPP NR Positioning 5G定位標準解讀(五)

前言 3GPP 標準網址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位標準解讀&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位標準解讀&#xff08;二&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位…

[GYCTF2020]EasyThinking --不會編程的崽

看標題就知道&#xff0c;這大概率是關于thinkphp的題目。先嘗試錯誤目錄使其報錯查看版本號 thinkphp v6.0.0&#xff0c;在網上搜索一下&#xff0c;這個版本有一個任意文件上傳漏洞。參考以下文章。 https://blog.csdn.net/god_zzZ/article/details/104275241 先注冊一個賬…

VL53L8CX驅動開發(1)----驅動TOF進行區域檢測

VL53L8CX驅動開發----1.驅動TOF進行區域檢測 概述視頻教學樣品申請源碼下載主要特點硬件準備技術規格系統框圖應用示意圖區域映射生成STM32CUBEMX選擇MCU 串口配置IIC配置LPn 設置X-CUBE-TOF1串口重定向代碼配置Tera Term配置演示結果 概述 VL53L8CX是一款8x8多區域ToF測距傳感…

STM32(6)中斷

1.中斷 1.1 中斷的概念 STM32的中斷&#xff1a; 1.2 中斷優先級 用數字的大小表示中斷優先級的高低&#xff0c;數字的范圍&#xff1a;0000--1111&#xff08;二進制&#xff09;&#xff0c;即0-15&#xff0c;共16級優先級。 進一步對這4位二進制數進行劃分&#xff0c;可…

demo型xss初級靶場

一、環境 XSS Game - Ma Spaghet! | PwnFunction 二、開始闖關 第一關 看看代碼 試一下直接寫 明顯進來了為什么不執行看看官方文檔吧 你不執行那我就更改單標簽去使用唄 ?somebody<img%20src1%20onerror"alert(1)"> 防御&#xff1a; innerText 第二關…

區塊鏈技術深度賦能多元行業應用的全景解析

隨著科技的日新月異&#xff0c;區塊鏈這一顛覆性技術正以前所未有的速度從理論走向實踐&#xff0c;并在眾多行業中扮演著關鍵性的變革角色。其獨特的分布式賬本、去中心化運作、公開透明以及數據不可篡改等核心特性&#xff0c;為金融、物聯網&#xff08;IoT&#xff09;、供…

常見的排序算法-(字解版)

快速排序算法 例如&#xff1a;3 1 2 7 5 6 第一次基數&#xff1a; 3 [] 1 2 7 5 6 3 和 6 5 7 比都比 3 大 &#xff0c; 位置不變 [] 1 2 7 5 63 和 2 比 &#xff0c;大于 2 放在右邊。 2 1 [] 7 5 63 和 1 比 &#xff0c;大于 1 位置不變。 2 1 3 7 5 6 把 3 的左邊和右…

分賬系統哪個好 盤點2024年好用的四款分賬系統

分賬系統在現代商業活動中扮演著至關重要的角色&#xff0c;為企業提供了高效、準確的分賬管理。那么&#xff0c;你知道2024年哪幾款分賬系統最好用呢&#xff1f;跟著小編的腳步去看看吧&#xff01; 一、商淘云 商淘云是廣州商淘信息科技有限公司旗下品牌&#xff0c;它提…

SPI是什么?

SPI是“串行外設接口”&#xff08;Serial Peripheral Interface&#xff09;的縮寫&#xff0c;它是一種高速的、全雙工、同步的通信協議&#xff0c;主要用于芯片與外設之間進行高速數據交換。SPI通信協議通常由一個主設備和一個或多個從設備組成。其核心是主設備控制時鐘信號…

ShardingJdbc分庫分表-淺談分表原理

文章目錄 為什么要分庫分表一、分庫分表二、不停機分庫分表數據遷移 為什么要分庫分表 一般的機器&#xff08;4核16G&#xff09;&#xff0c;單庫的MySQL并發&#xff08;QPSTPS&#xff09;超過了2k&#xff0c;系統基本就完蛋了。最好是并發量控制在1k左右。這里就引出一個…

matplotlib從起點出發(14)_Tutorial_imshow_origin_extent

0 總述 imshow()允許你將圖像&#xff08;將進行顏色映射——基于norm和cmap——的2D數組或將按原樣使用的3D RGB(A)的數組&#xff09;渲染到數據空間中的矩形區域。最終渲染中圖像的方向由原點和范圍關鍵字參數&#xff08;以及生成的AxesImage實例上的屬性&#xff09;和Ax…

一.數據分析簡介

目錄 一、了解數據分析 1.1 什么是數據分析 1.2 數據分析的重要性 1.3 數據分析的基本流程 數據獲取 數據處理 1.4 數據分析的應用場景 客戶分析 營銷分析 二、數據分析工具 jupyter 2.1 編輯器安裝 2.2 Jupyter快捷使用 一、了解數據分析 學習數據分析&#xff0…

[激光原理與應用-75]:激光器設計過程中,功率下降的主要原因大全

目錄 前言&#xff1a;激光器的本質是“電”轉“光”的設備 一、激光器功率下降的原因 二、壽命到期導致功率下降的因素 三、光損耗導致激光器輸出功率下降的因素 四、激光器中的能量轉化不完全導致的功率下降的因素 五、溫度變化導致激光器功率下降的影響因素 六、材料…

LeetCode28 最后一個單詞的長度

題目 給你一個字符串 s&#xff0c;由若干單詞組成&#xff0c;單詞前后用一些空格字符隔開。返回字符串中 最后一個 單詞的長度。單詞 是指僅由字母組成、不包含任何空格字符的最大子字符串。 示例 示例 1&#xff1a;輸入&#xff1a;s "Hello World" 輸出&#x…