數據庫中加全局鎖,是一個比較重的操作,執行全局鎖時會鎖住整個數據庫,同時存在以下問題:

在InnoDB引擎中,我們可以在備份是加上參數--single-transaction參數來完成不加鎖的一次性數據備份。

表級鎖,每次操作鎖住整張表,鎖定粒度大,發生鎖沖突的概率最高,并發度最低,應用在MyISAM、InnoDB、BDB等存儲引擎中。
表級鎖又主要分為以下三類:
表鎖又分為兩類:
相關語法:
當客戶端A對表1上了讀鎖之后,哪怕是客戶端A,也無法再對表1進行除了讀以外的操作,比如說增刪改,此時如果其他客戶端也來操作表1,也是只能執行讀取操作,只有當客戶端A釋放了鎖,才能進行其他操作。
寫鎖(write lock)是什么?當客戶端A對表1上了寫鎖之后,只有客戶端A可以對表1進行增刪改查操作,而此時其他客戶端要想來操作表1進行增刪改查,都會進入阻塞狀態,只有當客戶端A釋放了鎖,操作才會恢復正常。
2.元數據鎖(meta data lock,MDL)MDL加鎖過程是系統自動控制,無需顯式使用(即不需要通過lock等關鍵字手動加鎖),在訪問一張表的時候會自動加上。MDL鎖主要作用是維護表元數據(元數據大概指的就是表結構)的數據一致性,在表上有活動事務的時候,不可以對元數據進行寫入操作。為了避免DML與DDL沖突,保證讀寫的正確性。
MySQL5.5中引入了MDL,當對一張表進行增刪改查的時候,加MDL讀鎖(共享);當對表結構進行變更操作的時候,加MDL寫鎖(排他)。


意向鎖又分為兩類:
可以通過一下SQL來查詢意向鎖以及行鎖的加鎖情況:

舉一個場景例子,如下圖所示,在不引用意向鎖的情況下,當線程A開啟事務之后,對id為3的記錄執行updata操作,在InnoDB引擎下會默認對該記錄賦上行鎖,此時有一個線程B嘗試對該表設置表鎖,線程B是需要一行一行地檢查整張表來判斷哪一行被上了表鎖,這樣非常影響性能。

當引入了意向鎖的概念之后,當線程A開啟事務之后,對id為3的記錄執行updata操作,在InnoDB引擎下會默認對該記錄賦上行鎖,并同時為整張表賦上意向鎖。此時線程B要想給該表設置全局鎖,它會去檢查這張表意向鎖的情況,通過意向鎖的情況來決定它能不能給這張表設置表鎖,如果意向鎖和線程B所要加的鎖是兼容的,那么可以正常加鎖,如果不兼容,則線程B會進入阻塞狀態,直到線程A提交完事務釋放鎖線程B才會退出阻塞。

行級鎖,每次操作鎖住對應的行數據。鎖定力度最小,發生鎖沖突的概率最低,并發度最高。應用在InnoDB存儲引擎中。
InnoDB的數據是基于索引組織的,行鎖是通過對索引上的索引項加鎖來實現的,而不是對數據記錄加的鎖,主要分為以下三類:?

其中InnoDB實現了以下兩種類型的行鎖:



1.對于圖中第一點,我們可以來舉個例子,假設一張表中的主鍵id數據有1,2,3,8,11,16,當一個服務器A對id為5的記錄進行updata操作時,因為表中沒有id為5的數據行記錄,那么就會有一個間隙鎖鎖在id為8之前,即間隙鎖的范圍是3-8,此時我們如果想要在服務器B對間隙中插入一條數據,譬如一條id為7的數據行,是會進入阻塞狀態的,該阻塞狀態會直到服務器A的事務提交完畢才結束。(間隙鎖唯一目的是防止其他事務插入間隙。間隙鎖可以多個共存,一個事務采用的間隙鎖不會組織另一個事務在同一間隙上采用間隙鎖,大致意思就是一個間隙是可以被多個事務疊加上間隙鎖)
2.對于圖中的第二點,我們可以接著來舉一個例子,如下圖,如果說我們要對非主鍵的字段18來進行等值查詢(譬如where age = 18)時,InnoDB會在16到18的這間隙中加一個鎖,同時給18本身加上鄰鍵鎖,還會給18到29這一間隙加上鎖(這句話就是上圖第二點中后面那兩句話,當向右遍歷的時候,只要那一個值不是你要查的數值18,那就會把鄰鍵鎖退化成間隙鎖,當向右查到的數據依舊包含不止一個18,那么查出來的所有18都會被加上鄰鍵鎖),因為其他服務器有可能會在16-18以及18-29之間再插入數據,而且還有可能插入的數據也是18,因為這并不是唯一索引。
另外,如果我們要使用范圍查詢,比如說要執行一條查詢語句的條件為age >=67,那么此時被上鎖的情況如下:
間隙鎖:(67,87)、(87,90)、(90,92)、(92,94)、(94,98)、(98,正無窮)
行鎖:67、87、90、92、94、98

本篇文章僅作為學習筆記,供大家復習或者參考,學習源來自于B站黑馬程序員下的MySQL數據庫教程74. 進階-鎖-行級鎖-間隙鎖&臨鍵鎖2_嗶哩嗶哩_bilibili
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
網站欄目:MySQL中的鎖,全局鎖、表級鎖、行級鎖-創新互聯
瀏覽路徑:http://www.yijiale78.com/article46/pijhg.html
成都網站建設公司_創新互聯,為您提供建站公司、網站內鏈、虛擬主機、網站改版、微信公眾號、動態網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯