MySQL中的鎖,全局鎖、表級(jí)鎖、行級(jí)鎖-創(chuàng)新互聯(lián)

全局鎖 特點(diǎn)

數(shù)據(jù)庫中加全局鎖,是一個(gè)比較重的操作,執(zhí)行全局鎖時(shí)會(huì)鎖住整個(gè)數(shù)據(jù)庫,同時(shí)存在以下問題:

為綏德等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及綏德網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、綏德網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
  1. 如果在主庫上備份,那么備份期間都不能執(zhí)行更新操作,業(yè)務(wù)基本上就得停擺。
  2. 如果在從庫上備份,那么備份期間從庫不能執(zhí)行主庫同步過來的二進(jìn)制日志(binlog),會(huì)導(dǎo)致主從延遲。

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

表級(jí)鎖

表級(jí)鎖,每次操作鎖住整張表,鎖定粒度大,發(fā)生鎖沖突的概率最高,并發(fā)度最低,應(yīng)用在MyISAM、InnoDB、BDB等存儲(chǔ)引擎中。

表級(jí)鎖又主要分為以下三類:

  • 表鎖
  • 元數(shù)據(jù)鎖(meta data lock,MDL)
  • 意向鎖
1.表鎖

表鎖又分為兩類:

  1. 表共享鎖/讀鎖(read lock)
  2. 表獨(dú)占寫鎖(write lock)

相關(guān)語法:

  • 加鎖:lock tables 表名... read/write。
  • 釋放鎖:unlock table / 客戶端斷開連接。
讀鎖(read lock)是什么?

當(dāng)客戶端A對表1上了讀鎖之后,哪怕是客戶端A,也無法再對表1進(jìn)行除了讀以外的操作,比如說增刪改,此時(shí)如果其他客戶端也來操作表1,也是只能執(zhí)行讀取操作,只有當(dāng)客戶端A釋放了鎖,才能進(jìn)行其他操作。

寫鎖(write lock)是什么?

當(dāng)客戶端A對表1上了寫鎖之后,只有客戶端A可以對表1進(jìn)行增刪改查操作,而此時(shí)其他客戶端要想來操作表1進(jìn)行增刪改查,都會(huì)進(jìn)入阻塞狀態(tài),只有當(dāng)客戶端A釋放了鎖,操作才會(huì)恢復(fù)正常。

2.元數(shù)據(jù)鎖(meta data lock,MDL)

MDL加鎖過程是系統(tǒng)自動(dòng)控制,無需顯式使用(即不需要通過lock等關(guān)鍵字手動(dòng)加鎖),在訪問一張表的時(shí)候會(huì)自動(dòng)加上。MDL鎖主要作用是維護(hù)表元數(shù)據(jù)(元數(shù)據(jù)大概指的就是表結(jié)構(gòu))的數(shù)據(jù)一致性,在表上有活動(dòng)事務(wù)的時(shí)候,不可以對元數(shù)據(jù)進(jìn)行寫入操作。為了避免DML與DDL沖突,保證讀寫的正確性。

MySQL5.5中引入了MDL,當(dāng)對一張表進(jìn)行增刪改查的時(shí)候,加MDL讀鎖(共享);當(dāng)對表結(jié)構(gòu)進(jìn)行變更操作的時(shí)候,加MDL寫鎖(排他)。

3.意向鎖

意向鎖又分為兩類:

  1. 意向共享鎖(IS):與表鎖共享鎖/讀鎖(read lock)兼容,與表排它鎖/寫鎖(write lock)互斥。
  2. 意向排它鎖(IX):與表共享鎖以及排它鎖都互斥,而意向鎖之間不會(huì)互斥。

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

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

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

行級(jí)鎖 1.行鎖

行級(jí)鎖,每次操作鎖住對應(yīng)的行數(shù)據(jù)。鎖定力度最小,發(fā)生鎖沖突的概率最低,并發(fā)度最高。應(yīng)用在InnoDB存儲(chǔ)引擎中。

InnoDB的數(shù)據(jù)是基于索引組織的,行鎖是通過對索引上的索引項(xiàng)加鎖來實(shí)現(xiàn)的,而不是對數(shù)據(jù)記錄加的鎖,主要分為以下三類:?

  • 行鎖(Record Lock):鎖定單個(gè)行記錄的鎖,防止其他事務(wù)對此進(jìn)行updata和delete。在RC(Read Committed)、RR(Repeatable Read)隔離級(jí)別下都支持
  • 間隙鎖(Grap Lock):鎖定索引記錄間隙(但是不包括該記錄),確保索引記錄間隙不變,防止其他事務(wù)在這個(gè)間隙進(jìn)行insert,產(chǎn)生幻讀,在RR(Repeatable Read)隔離級(jí)別下都支持
  • 鄰鍵鎖(Next-Key Lock):行鎖和間隙鎖組合,同時(shí)鎖住數(shù)據(jù),并鎖住數(shù)據(jù)前面的間隙Gap,在RR(Repeatable Read)隔離級(jí)別下支持

其中InnoDB實(shí)現(xiàn)了以下兩種類型的行鎖:

  1. 共享鎖(S):允許一個(gè)事務(wù)去讀一行,阻止其他事務(wù)獲得其他相同數(shù)據(jù)集的排它鎖。共享鎖和共享鎖之間是兼容的,但共享鎖和排它鎖之間是互斥的。
  2. 排它鎖(X):允許獲取排它鎖的事務(wù)更新數(shù)據(jù),阻止其他事務(wù)獲得相同數(shù)據(jù)集的共享鎖和排它鎖

2.間隙鎖/鄰鍵鎖?

1.對于圖中第一點(diǎn),我們可以來舉個(gè)例子,假設(shè)一張表中的主鍵id數(shù)據(jù)有1,2,3,8,11,16,當(dāng)一個(gè)服務(wù)器A對id為5的記錄進(jìn)行updata操作時(shí),因?yàn)楸碇袥]有id為5的數(shù)據(jù)行記錄,那么就會(huì)有一個(gè)間隙鎖鎖在id為8之前,即間隙鎖的范圍是3-8,此時(shí)我們?nèi)绻胍诜?wù)器B對間隙中插入一條數(shù)據(jù),譬如一條id為7的數(shù)據(jù)行,是會(huì)進(jìn)入阻塞狀態(tài)的,該阻塞狀態(tài)會(huì)直到服務(wù)器A的事務(wù)提交完畢才結(jié)束。(間隙鎖唯一目的是防止其他事務(wù)插入間隙。間隙鎖可以多個(gè)共存,一個(gè)事務(wù)采用的間隙鎖不會(huì)組織另一個(gè)事務(wù)在同一間隙上采用間隙鎖,大致意思就是一個(gè)間隙是可以被多個(gè)事務(wù)疊加上間隙鎖)

2.對于圖中的第二點(diǎn),我們可以接著來舉一個(gè)例子,如下圖,如果說我們要對非主鍵的字段18來進(jìn)行等值查詢(譬如where age = 18)時(shí),InnoDB會(huì)在16到18的這間隙中加一個(gè)鎖,同時(shí)給18本身加上鄰鍵鎖,還會(huì)給18到29這一間隙加上鎖(這句話就是上圖第二點(diǎn)中后面那兩句話,當(dāng)向右遍歷的時(shí)候,只要那一個(gè)值不是你要查的數(shù)值18,那就會(huì)把鄰鍵鎖退化成間隙鎖,當(dāng)向右查到的數(shù)據(jù)依舊包含不止一個(gè)18,那么查出來的所有18都會(huì)被加上鄰鍵鎖),因?yàn)槠渌?wù)器有可能會(huì)在16-18以及18-29之間再插入數(shù)據(jù),而且還有可能插入的數(shù)據(jù)也是18,因?yàn)檫@并不是唯一索引。

另外,如果我們要使用范圍查詢,比如說要執(zhí)行一條查詢語句的條件為age >=67,那么此時(shí)被上鎖的情況如下:

間隙鎖:(67,87)、(87,90)、(90,92)、(92,94)、(94,98)、(98,正無窮)

行鎖:67、87、90、92、94、98

本篇文章僅作為學(xué)習(xí)筆記,供大家復(fù)習(xí)或者參考,學(xué)習(xí)源來自于B站黑馬程序員下的MySQL數(shù)據(jù)庫教程74. 進(jìn)階-鎖-行級(jí)鎖-間隙鎖&臨鍵鎖2_嗶哩嗶哩_bilibili


你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)站欄目:MySQL中的鎖,全局鎖、表級(jí)鎖、行級(jí)鎖-創(chuàng)新互聯(lián)
瀏覽路徑:http://muchs.cn/article46/pijhg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司網(wǎng)站內(nèi)鏈、虛擬主機(jī)、網(wǎng)站改版、微信公眾號(hào)動(dòng)態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)