Mysql---鎖篇

1:MySQL 有哪些鎖?

全局鎖
flush tables with read lock 整個數據庫就處于只讀狀態了
unlock tables 釋放全局鎖

全局鎖主要應用于做全庫邏輯備份,這樣在備份數據庫期間,不會因為數據或表結構的更新,而出現備份文件的數據與預期的不一樣。

如果數據庫的引擎支持的事務支持可重復讀的隔離級別,那么在備份數據庫之前先開啟事務,會先創建 Read View,然后整個事務執行期間都在用這個 Read View,而且由于 MVCC 的支持,備份期間業務依然可以對數據進行更新操作。

備份數據庫的工具是 mysqldump,在使用 mysqldump 時加上 –single-transaction 參數的時候,就會在備份數據庫之前先開啟事務。這種方法只適用于支持「可重復讀隔離級別的事務」的存儲引擎。
InnoDB 存儲引擎默認的事務隔離級別正是可重復讀,因此可以采用這種方式來備份數據庫。

表級鎖
表鎖;
表鎖除了會限制別的線程的讀寫外,也會限制本線程接下來的讀寫操作。盡量避免在使用 InnoDB 引擎的表使用表鎖,因為表鎖的顆粒度太大。

元數據鎖(MDL);
不需要顯示的使用 MDL,因為當我們對數據庫表進行操作時,會自動給這個表加上 MDL
對一張表進行 CRUD 操作時,加的是 MDL 讀鎖;
對一張表做結構變更操作的時候,加的是 MDL 寫鎖
MDL 是在事務提交后才會釋放,這意味著事務執行期間,MDL 是一直持有的

意向鎖;
在使用 InnoDB 引擎的表里對某些記錄加上「共享鎖」之前,需要先在表級別加上一個「意向共享鎖」;
在使用 InnoDB 引擎的表里對某些紀錄加上「獨占鎖」之前,需要先在表級別加上一個「意向獨占鎖」;
意向共享鎖和意向獨占鎖是表級鎖,不會和行級的共享鎖和獨占鎖發生沖突,而且意向鎖之間也不會發生沖突,只會和共享表鎖(lock tables ... read)和獨占表鎖(lock tables ... write)發生沖突。
意向鎖的目的是為了快速判斷表里是否有記錄被加鎖。

AUTO-INC 鎖;
表里的主鍵通常都會設置成自增的,這是通過對主鍵字段聲明 AUTO_INCREMENT 屬性實現的。
之后可以在插入數據時,可以不指定主鍵的值,數據庫會自動給主鍵賦值遞增的值,這主要是通過 AUTO-INC 鎖實現的
AUTO-INC 鎖是特殊的表鎖機制,鎖不是再一個事務提交后才釋放,而是再執行完插入語句后就會立即釋放。

AUTO-INC 鎖再對大量數據進行插入的時候,會影響插入性能
在 MySQL 5.1.22 版本開始,InnoDB 存儲引擎提供了一種輕量級的鎖來實現自增。
一樣也是在插入數據的時候,會為被 AUTO_INCREMENT 修飾的字段加上輕量級鎖,然后給該字段賦值一個自增的值,就把這個輕量級鎖釋放了,而不需要等待整個插入語句執行完后才釋放鎖

InnoDB 存儲引擎提供了個 innodb_autoinc_lock_mode 的系統變量,是用來控制選擇用 AUTO-INC 鎖,還是輕量級的鎖
當 innodb_autoinc_lock_mode = 0,就采用 AUTO-INC 鎖,語句執行結束后才釋放鎖;
當 innodb_autoinc_lock_mode = 2,就采用輕量級鎖,申請自增主鍵后就釋放鎖,并不需要等語句執行后才釋放。
當 innodb_autoinc_lock_mode = 1:
普通 insert 語句,自增鎖在申請之后就馬上釋放;
類似 insert … select 這樣的批量插入數據的語句,自增鎖還是要等語句結束后才被釋放
當 innodb_autoinc_lock_mode = 2 是性能最高的方式,但是當搭配 binlog 的日志格式是 statement 一起使用的時候,在「主從復制的場景」中會發生數據不一致的問題
因為binlog_format=statement,記錄的語句就是原始語句。
binlog_format = row時,binlog 里面記錄的是主庫分配的自增值,到備庫執行的時候,主庫的自增值是什么,從庫的自增值就是什么。
所以當 innodb_autoinc_lock_mode = 2 時,并且 binlog_format = row,既能提升并發性,又不會出現數據一致性問題。

行級鎖
//對讀取的記錄加共享鎖
select ... lock in share mode;
//對讀取的記錄加獨占鎖
select ... for update;
共享鎖(S鎖)滿足讀讀共享,讀寫互斥。獨占鎖(X鎖)滿足寫寫互斥、讀寫互斥。

Record Lock
Record Lock 稱為記錄鎖,鎖住的是一條記錄。而且記錄鎖是有 S 鎖和 X 鎖之分的:
當一個事務對一條記錄加了 S 型記錄鎖后,其他事務也可以繼續對該記錄加 S 型記錄鎖(S 型與 S 鎖兼容),但是不可以對該記錄加 X 型記錄鎖(S 型與 X 鎖不兼容);
當一個事務對一條記錄加了 X 型記錄鎖后,其他事務既不可以對該記錄加 S 型記錄鎖(S 型與 X 鎖不兼容),也不可以對該記錄加 X 型記錄鎖(X 型與 X 鎖不兼容)。

Gap Lock
Gap Lock 稱為間隙鎖,只存在于可重復讀隔離級別,目的是為了解決可重復讀隔離級別下幻讀的現象。
假設,表中有一個范圍 id 為(3,5)間隙鎖,那么其他事務就無法插入 id = 4 這條記錄了,這樣就有效的防止幻讀現象的發生。

間隙鎖之間的X型間隙鎖和S型間隙鎖是兼容的,即兩個事務可以同時持有包含共同間隙范圍的間隙鎖,并不存在互斥關系,因為間隙鎖的目的是防止插入幻影記錄而提出的。

Next-Key Lock
Next-Key Lock 稱為臨鍵鎖,是 Record Lock + Gap Lock 的組合,鎖定一個范圍,并且鎖定記錄本身。
假設,表中有一個范圍 id 為(3,5] 的 next-key lock,那么其他事務即不能插入 id = 4 記錄,也不能修改 id = 5 這條記錄。

next-key lock 是包含間隙鎖+記錄鎖的,如果一個事務獲取了 X 型的 next-key lock,那么另外一個事務在獲取相同范圍的 X 型的 next-key lock 時,是會被阻塞的。
雖然相同范圍的間隙鎖是多個事務相互兼容的,但對于記錄鎖,我們是要考慮 X 型與 S 型關系,X 型的記錄鎖與 X 型的記錄鎖是沖突的。

插入意向鎖
一個事務在插入一條記錄的時候,需要判斷插入位置是否已被其他事務加了間隙鎖(next-key lock 也包含間隙鎖)。
如果有的話,插入操作就會發生阻塞,直到擁有間隙鎖的那個事務提交為止(釋放間隙鎖的時刻),在此期間會生成一個插入意向鎖,表明有事務想在某個區間插入新記錄,但是現在處于等待狀態。
插入意向鎖名字雖然有意向鎖,但是它并不是意向鎖,它是一種特殊的間隙鎖,屬于行級別鎖。
插入意向鎖與間隙鎖的另一個非常重要的差別是:
盡管「插入意向鎖」也屬于間隙鎖,但兩個事務卻不能在同一時間內,一個擁有間隙鎖,另一個擁有該間隙區間內的插入意向鎖(當然,插入意向鎖如果不在間隙鎖區間內則是可以的)。

2:MySQL 是怎么加鎖的?


什么 SQL 語句會加行級鎖?
要在查詢時對記錄加行級鎖,可以使用下面這兩個方式,這兩種查詢會加鎖的語句稱為鎖定讀
//對讀取的記錄加共享鎖(S型鎖)
select ... lock in share mode;
//對讀取的記錄加獨占鎖(X型鎖)
select ... for update;
除了上面這兩條鎖定讀語句會加行級鎖之外,update 和 delete 操作都會加行級鎖,且鎖的類型都是獨占鎖(X型鎖)。

MySQL 是怎么加行級鎖的?
加鎖的對象是索引,加鎖的基本單位是 next-key lock,它是由記錄鎖和間隙鎖組合而成的,next-key lock 是前開后閉區間,而間隙鎖是前開后開區間。
在能使用記錄鎖或者間隙鎖就能避免幻讀現象的場景下, next-key lock 就會退化成記錄鎖或間隙鎖。

唯一索引等值查詢:
當查詢的記錄是「存在」的,在索引樹上定位到這一條記錄后,將該記錄的索引中的 next-key lock 會退化成「記錄鎖」。
當查詢的記錄是「不存在」的,在索引樹找到第一條大于該查詢記錄的記錄后,將該記錄的索引中的 next-key lock 會退化成「間隙鎖」。

非唯一索引等值查詢:
當查詢的記錄「存在」時,由于不是唯一索引,所以肯定存在索引值相同的記錄,于是非唯一索引等值查詢的過程是一個掃描的過程,直到掃描到第一個不符合條件的二級索引記錄就停止掃描,然后在掃描的過程中,對掃描到的二級索引記錄加的是 next-key 鎖,而對于第一個不符合條件的二級索引記錄,該二級索引的 next-key 鎖會退化成間隙鎖。同時,在符合查詢條件的記錄的主鍵索引上加記錄鎖。
當查詢的記錄「不存在」時,掃描到第一條不符合條件的二級索引記錄,該二級索引的 next-key 鎖會退化成間隙鎖。因為不存在滿足查詢條件的記錄,所以不會對主鍵索引加鎖。

非唯一索引和主鍵索引的范圍查詢的加鎖規則不同之處在于:
唯一索引在滿足一些條件的時候,索引的 next-key lock 退化為間隙鎖或者記錄鎖。
非唯一索引范圍查詢,索引的 next-key lock 不會退化為間隙鎖和記錄鎖。
其實理解 MySQL 為什么要這樣加鎖,主要要以避免幻讀角度去分析,這樣就很容易理解這些加鎖的規則了。

還有一件很重要的事情,在線上在執行 update、delete、select ... for update 等具有加鎖性質的語句,一定要檢查語句是否走了索引,如果是全表掃描的話,會對每一個索引加 next-key 鎖,相當于把整個表鎖住了,這是挺嚴重的問題。


這里我們重點關注行鎖,圖中 LOCK_TYPE 中的 RECORD 表示行級鎖,而不是記錄鎖的意思,通過LOCK_MODE 可以確認是 next-key 鎖,還是間隙鎖,還是記錄鎖:
如果 LOCK_MODE 為 X,說明是 X 型的 next-key 鎖;
如果 LOCK_MODE 為 X, REC_NOT_GAP,說明是 X 型的記錄鎖;
如果 LOCK_MODE 為 X, GAP,說明是 X 型的間隙鎖;

3:如何避免死鎖?

死鎖的四個必要條件:互斥、占有且等待、不可強占用、循環等待。只要系統發生死鎖,這些條件必然成立,但是只要破壞任意一個條件就死鎖就不會成立。
在數據庫層面,有兩種策略通過「打破循環等待條件」來解除死鎖狀態:
? ? ? :?設置事務等待鎖的超時時間。當一個事務的等待時間超過該值后,就對這個事務進行回滾,于是鎖就釋設置事務等待鎖的超時時間。當一個事務的等待時間超過該值后,就對這個事務進行回滾,于是鎖就釋時時間的,默認值時 50 秒。
? ? ? : 開啟主動死鎖檢測。主動死鎖檢測在發現死鎖后,主動回滾死鎖鏈條中的某一個事務,讓其他事務得以開啟主動死鎖檢測。主動死鎖檢測在發現死鎖后,主動回滾死鎖鏈條中的某一個事務,讓其他事務得以
上面這個兩種策略是「當有死鎖發生時」的避免方式。
我們可以回歸業務的角度來預防死鎖,對訂單做冪等性校驗的目的是為了保證不會出現重復的訂單,那我們可以回歸業務的角度來預防死鎖,對訂單做冪等性校驗的目的是為了保證不會出現重復的訂單,不過有一點不好的地方就是在我們插入一個已經存在的訂單記錄時就會拋出異常。


?

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

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

相關文章

VLAN綜合實驗二

一.實驗拓撲: 二.實驗需求: 1.內網Ip地址使用172.16.0.0/分配 2.sw1和SW2之間互為備份 3.VRRP/STP/VLAN/Eth-trunk均使用 4.所有Pc均通過DHCP獲取IP地址 5.ISP只能配置IP地址 6.所有…

GEO(生成引擎優化)實施策略全解析:從用戶意圖到效果追蹤

——基于行業實證的AI信源占位方法論 ?一、理解用戶查詢:構建AI語料的核心起點 生成式AI的內容推薦邏輯以用戶意圖為核心,?精準捕捉高頻問題是GEO優化的第一步。企業需通過以下方法挖掘用戶真實需求: ?AI對話日志分析: 分析用…

HTML基礎及進階

目錄 一、HTML基礎 1.什么是HTML 2.常用標簽 (1)標題標簽:h1-h6數字越小文字會越大,這個標簽會占一整行 (2)加粗標簽: (3)換行標簽: (4&am…

MSTP與鏈路聚合技術

MSTP(多生成樹協議) 簡介 MSTP(多生成樹協議)是Spanning Tree Protocol(STP)的改進版,支持網絡中使用多條生成樹,并根據用戶需求限制生成樹間的路徑。MSTP將多個VLAN映射到一棵生成…

ModuleNotFoundError: No module named ‘ml_logger.logbook‘

問題 (legion) zhouy24RL-DSlab:~/zhouy24Files/legion/LEGION$ python main.py ML_LOGGER_USER is not set. This is required for online usage. Traceback (most recent call last): File “main.py”, line 7, in from mtrl.app.run import run File “/data/zhouy24File…

c# ftp上傳下載 幫助類

工作中FTP的上傳和下載還是很常用的。如下載打標數據,上傳打標結果等。 這個類常用方法都有了:上傳,下載,判斷文件夾是否存在,創建文件夾,獲取當前目錄下文件列表(不包括文件夾) ,獲取當前目錄下文件列表(不包括文件夾) ,獲取FTP文件列表(包括文件夾), 獲取當前目…

PyTorch 分布式訓練(Distributed Data Parallel, DDP)簡介

PyTorch 分布式訓練(Distributed Data Parallel, DDP) 一、DDP 核心概念 torch.nn.parallel.DistributedDataParallel 1. DDP 是什么? Distributed Data Parallel (DDP) 是 PyTorch 提供的分布式訓練接口,DistributedDataPara…

策略模式_行為型_GOF23

策略模式 策略模式(Strategy Pattern)是一種行為型設計模式,核心思想是將一組算法封裝成獨立對象,使它們可以相互替換,從而讓算法的變化獨立于使用它的客戶端。這類似于游戲中的技能切換——玩家根據戰況選擇不同技能…

【Python】天氣數據可視化

1. Python進行數據可視化 在數據分析和科學計算領域,Python憑借其強大的庫和簡潔的語法,成為了眾多開發者和科研人員的首選工具。數據可視化作為數據分析的重要環節,能夠幫助我們更直觀地理解數據背后的規律和趨勢。本文將詳細介紹如何使用P…

深度學習4.4筆記

《動手學深度學習》-4.4-筆記 驗證數據集:通常是從訓練集中劃分出來的一部分數據,不要和訓練數據混在一起,評估模型好壞的數據集 測試數據集:只用一次的數據集 k-折交叉驗證(k-Fold Cross-Validation)是…

vue 兩種路由模式

一、兩種模式比較 在vue.js中,路由模式分為兩種:hash 模式和 history 模式。這兩種模式決定了URL的結構和瀏覽器歷史記錄的管理方式。 1. hash 模式帶 #,#后面的地址變化不會引起頁面的刷新。換句話說,hash模式不會將#后面的地址…

Android生態大變革,谷歌調整開源政策,核心開發不再公開

“開源”這個詞曾經是Android的護城河,如今卻成了谷歌的燙手山芋。最近谷歌宣布調整Android的開源政策,核心開發將全面轉向私有分支。翻譯成人話就是:以后Android的核心更新,不再公開共享了。 這操作不就是開源變節嗎,…

JavaScript中集合常用操作方法詳解

JavaScript中集合常用操作方法詳解 JavaScript中的集合主要包括數組(Array)、集合(Set)和映射(Map)。下面我將詳細介紹這些集合類型的常用操作方法。 數組(Array) 數組是JavaScript中最常用的集合類型,提供了豐富的操作方法。 創建數組 // 字面量創建 const ar…

【HC-05】藍牙串口通信模塊調試與應用(1)

一、HC-05 基礎學習視頻 HC-05藍牙串口通信模塊調試與應用1 二、HC-05學習視頻課件

【學Rust寫CAD】18 定點數2D仿射變換矩陣結構體(MatrixFixedPoint結構別名)

源碼 // matrix/fixed.rs use crate::fixed::Fixed; use super::generic::Matrix;/// 定點數矩陣類型別名 pub type MatrixFixedPoint Matrix<Fixed, Fixed, Fixed, Fixed, Fixed, Fixed>;代碼解析 這段代碼定義了一個定點數矩陣的類型別名 MatrixFixedPoint&#xff…

axios文件下載使用后端傳遞的名稱

java后端通過HttpServletResponse 返回文件流 在Content-Disposition中插入文件名 一定要設置Access-Control-Expose-Headers&#xff0c;代表跨域該Content-Disposition返回Header可讀&#xff0c;如果沒有&#xff0c;前端是取不到Content-Disposition的&#xff0c;可以在統…

HarmonyOS之深入解析如何根據url下載pdf文件并且在本地顯示和預覽

一、文件下載 ① 網絡請求配置 下載在線文件&#xff0c;需要訪問網絡&#xff0c;因此需要在 config.json 中添加網絡權限&#xff1a; {"module": {"requestPermissions": [{"name": "ohos.permission.INTERNET","reason&qu…

鴻蒙前后端項目源碼-點餐v3.0-原創!原創!原創!

鴻蒙前后端點餐項目源碼含文檔ArkTS語言. 原創作品.我半個月寫的原創作品&#xff0c;請尊重原創。 原創作品&#xff0c;盜版必究&#xff01;&#xff01;&#xff01;&#xff01; 原創作品&#xff0c;盜版必究&#xff01;&#xff01;&#xff01;&#xff01; 原創作…

VUE3+TypeScript項目,使用html2Canvas+jspdf生成PDF并實現--分頁--頁眉--頁尾

使用html2CanvasJsPDF生成pdf&#xff0c;并實現分頁添加頁眉頁尾 1.封裝方法htmlToPdfPage.ts /**path: src/utils/htmlToPdfPage.tsname: 導出頁面為PDF格式 并添加頁眉頁尾 **/ /*** 封裝思路* 1.將頁面根據A4大小分隔邊距&#xff0c;避免內容被中間截斷* 所有元素層級不要…

5.Excel:從網上獲取數據

一 用 Excel 數據選項卡獲取數據的方法 連接。 二 要求獲取實時數據 每1分鐘自動更新數據。 A股市場_同花順行情中心_同花順財經網 用上面方法將數據加載進工作表中。 在表格內任意區域右鍵&#xff0c;刷新。 自動刷新&#xff1a; 三 缺點 Excel 只能爬取網頁上表格類型的…