眾所周知,innodb是默認(rèn)行鎖,當(dāng)然也支持表鎖。如下是對于行鎖的算法進(jìn)行的一些實(shí)驗(yàn)。

成都創(chuàng)新互聯(lián)專注于高郵網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供高郵營銷型網(wǎng)站建設(shè),高郵網(wǎng)站制作、高郵網(wǎng)頁設(shè)計(jì)、高郵網(wǎng)站官網(wǎng)定制、小程序制作服務(wù),打造高郵網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供高郵網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
鎖的算法為:我知道是行鎖,但是是如何鎖的,鎖多少數(shù)據(jù)
假如有個(gè)索引是:[1,2,3,7]
record lock 鎖的是 1,2,3,7
gap lock 鎖的是 (- ,1),(2,3),(3,7),(7,+ )反正鎖的就是區(qū)間,不是行
next-key lock鎖的是 (- ,1],[2,3),[3,7),[ 7,+ )既鎖范圍也鎖行
Innodb鎖算法規(guī)則如下:
在可重復(fù)讀隔離級別下,innodb默認(rèn)使用的是next-key lock算法,當(dāng)查詢的索引是主鍵或者唯一索引的情況下,才會退化為record lock,在使用next-key lock算法時(shí),不僅僅會鎖住范圍,還會給范圍最后的一個(gè)鍵值加一個(gè)gap lock。
其中l(wèi)ockmode中的X鎖為左邊會話中的鎖,因?yàn)樾枰@式的commit之后才會釋放鎖,第二個(gè)S鎖,為右邊的共享鎖,因?yàn)橹麈IID為1的已經(jīng)被鎖住了,所以處于鎖等待狀態(tài),鎖的類型為record lock
使用輔助索引a=8進(jìn)行操作,這個(gè)時(shí)候理論應(yīng)該對主鍵索引加record lock 則 主鍵ID=8的被鎖,然后輔助索引被加next-key lock 則為:
(7,8] 然后對下一個(gè)鍵值加gap鎖,則為:(8,11)
所以目前被鎖住的記錄為:
1.主鍵為8的被鎖
2.輔助索引8的被鎖
3.輔助索引8到11之間的被鎖,意味著你這個(gè)時(shí)候往8到11之間寫數(shù)據(jù)會報(bào)錯(cuò)
當(dāng)使用范圍條件進(jìn)行更新時(shí),此時(shí)肯定是需要加X鎖的,我是用的也是主鍵,所以按照理論應(yīng)該是加的record lock ,但是卻加了gap lock,因?yàn)椴迦胫禐?0的阻塞了,查看information 也提示X.GAP
這個(gè)有點(diǎn)暈為啥主鍵變成了next-key lock ,不應(yīng)該是record lock么?
update20200515
在知乎看到的一個(gè)解釋:
即,在無論使用主鍵索引還是非主鍵索引的時(shí)候,請求共享鎖或者排他鎖,innodb會給范圍內(nèi)的記錄加鎖,而范圍內(nèi)的間隙也會被加鎖,
例如一個(gè)表t 的 id為1,2,3,7,10
假如執(zhí)行如下:
select * from t where id =3 for update
那么這個(gè)時(shí)候執(zhí)行
insert into t(id) values(8) 會被阻塞,因?yàn)槭窃谡埱笈潘i時(shí)使用了范圍,所以[3,10],甚至10以后的任何數(shù)據(jù)都無法插入。
執(zhí)行
select * from t where id =3 lock in share mode
insert into t(id) values(8) 會被阻塞,因?yàn)槭窃谡埱蠊蚕礞i時(shí)使用了范圍,所以[3,10],甚至10以后的任何數(shù)據(jù)都無法插入。
幻讀是同一事務(wù)下,連續(xù)執(zhí)行兩次同樣的sql可能導(dǎo)致不同的結(jié)果,第二次返回的數(shù)據(jù)可能導(dǎo)致以前不存在的行。
同時(shí)一般會問它和臟讀的區(qū)別,臟讀為讀取到其他事務(wù)未提交的數(shù)據(jù),但是幻讀是讀取的其他事務(wù)已經(jīng)提交的數(shù)據(jù)。
reference:
當(dāng) web 日志中出現(xiàn)行鎖超時(shí)錯(cuò)誤后,很多開發(fā)都會找我來排查問題,這里說下問題定位的難點(diǎn)!
1. MySQL 本身不會主動(dòng)記錄行鎖等待的相關(guān)信息,所以無法有效的進(jìn)行事后分析。
2. 鎖爭用原因有多種,很難在事后判斷到底是哪一類問題場景,尤其是事后無法復(fù)現(xiàn)問題的時(shí)候。
3. 找到問題 SQL 后,開發(fā)無法有效從代碼中挖掘出完整的事務(wù),這也和公司框架-產(chǎn)品-項(xiàng)目的架構(gòu)有關(guān),需要靠 DBA 事后采集完整的事務(wù) SQL 才可以進(jìn)行分析。
1、在mysql數(shù)據(jù)庫中如何鎖定一行數(shù)據(jù),保證不被其他的操作影響。
2、從對數(shù)據(jù)的操作類型分為讀鎖和寫鎖。從對數(shù)據(jù)操作的粒度來分:表鎖和行鎖。
3、現(xiàn)在我們建立一個(gè)表來演示數(shù)據(jù)庫的行鎖講解。
4、行鎖基本演示如下圖所示。
5、如果兩個(gè)會話操作的是不同的行,就不會互相阻塞了。
分享文章:mysql怎么走行鎖 五味子泡制方法
本文鏈接:http://chinadenli.net/article30/ddgsepo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、外貿(mào)建站、關(guān)鍵詞優(yōu)化、做網(wǎng)站、小程序開發(fā)、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(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)