數(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)!在InnoDB引擎中,我們可以在備份是加上參數(shù)--single-transaction參數(shù)來完成不加鎖的一次性數(shù)據(jù)備份。
表級(jí)鎖表級(jí)鎖,每次操作鎖住整張表,鎖定粒度大,發(fā)生鎖沖突的概率最高,并發(fā)度最低,應(yīng)用在MyISAM、InnoDB、BDB等存儲(chǔ)引擎中。
表級(jí)鎖又主要分為以下三類:
表鎖又分為兩類:
相關(guān)語法:
當(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.意向鎖意向鎖又分為兩類:
可以通過一下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ù)記錄加的鎖,主要分為以下三類:?
其中InnoDB實(shí)現(xiàn)了以下兩種類型的行鎖:
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)
猜你還喜歡下面的內(nèi)容