溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Innodb鎖定讀是什么

發(fā)布時(shí)間:2021-11-19 10:42:06 來(lái)源:億速云 閱讀:112 作者:iii 欄目:MySQL數(shù)據(jù)庫(kù)

這篇文章主要介紹“Innodb鎖定讀是什么”,在日常操作中,相信很多人在Innodb鎖定讀是什么問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Innodb鎖定讀是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

如果查詢(xún)數(shù)據(jù),接著在相同的事務(wù)中插入或者修改相關(guān)數(shù)據(jù),常規(guī)的select語(yǔ)句不能保護(hù)數(shù)據(jù)不被其他事務(wù)修改。其他事務(wù)可以更新或者刪除剛才查詢(xún)事務(wù)中相同的行。

InnoDB支持2種類(lèi)型的鎖定讀:

1、SELECT ... LOCK IN SHARE MODE設(shè)置一個(gè)共享S鎖在被查詢(xún)的行上。其他會(huì)話(huà)能讀取這些行,但是不能修改相應(yīng)行的數(shù)據(jù),直到此事務(wù)結(jié)束。如果其他事務(wù)對(duì)相應(yīng)的行進(jìn)行了DML操作,而未結(jié)束事務(wù)前,那當(dāng)前事務(wù)中進(jìn)行SELECT ... LOCK IN SHARE MODE將一直等待,直到另外的事務(wù)完成。

2、SELECT ... FOR UPDATE設(shè)置一個(gè)排他X鎖在相應(yīng)的行上。按照索引進(jìn)行select for update查詢(xún)時(shí),會(huì)鎖住相關(guān)的索引條目和行數(shù)據(jù)。同樣的,此期間其他事務(wù)對(duì)相關(guān)的行進(jìn)行更新、SELECT ... LOCK IN SHARE MODE、在某些事務(wù)隔離級(jí)別讀數(shù)據(jù)都將會(huì)被堵塞,但一致性讀會(huì)忽略存在的任何鎖,因?yàn)槔习姹镜臄?shù)據(jù)不能被鎖定,它們通過(guò)undo log在內(nèi)存中構(gòu)造數(shù)據(jù)的拷貝。

 

注意:使用鎖定讀操作的時(shí)候,必須開(kāi)啟事務(wù)(可以通過(guò)START TRANSACTION或者set autocommit=0來(lái)開(kāi)啟事務(wù)),鎖定讀相關(guān)的鎖在事務(wù)commit或者rollback時(shí),都會(huì)立即釋放。如果沒(méi)有開(kāi)啟事務(wù),則相關(guān)的行不會(huì)被鎖定。


用法舉例

假如要往子表插入一條記錄,插入前首先要確認(rèn)一下父表有無(wú)相關(guān)記錄,只有在父表有對(duì)應(yīng)記錄時(shí)插入才能滿(mǎn)足應(yīng)用數(shù)據(jù)的完整性約束。如果使用一致性非鎖定讀來(lái)檢查父表相應(yīng)的記錄,而在往子表插入對(duì)應(yīng)數(shù)據(jù)的瞬間,其他會(huì)話(huà)的事務(wù)剛好在你查詢(xún)父表之后插入子表之前刪除或者修改了剛才查到的行,這樣接下來(lái)的插入操作將可能會(huì)不能順利的完成。

可以使用LOCK IN SHARE MODE進(jìn)行鎖定讀,來(lái)避免此潛在的問(wèn)題。如下:

SELECT * FROM parent WHERE NAME = 'Jones' LOCK IN SHARE MODE;

在父表使用LOCK IN SHARE MODE進(jìn)行查詢(xún)到j(luò)ones,此時(shí)你能安全的在子表中插入jones相關(guān)的數(shù)據(jù)。此期間如果有其他會(huì)話(huà)事務(wù)視圖DML父表中相應(yīng)的行將會(huì)被阻塞,直到你的完成你的操作后結(jié)束鎖定讀的事務(wù),這樣可以保證父表、子表的數(shù)據(jù)的一致性。

另外一個(gè)場(chǎng)景,如有兩個(gè)session需要讀取某表A中的一行,在成功讀取后在同一事務(wù)中更新該行,并在另外的表B中插入剛開(kāi)始讀取到的行。若此時(shí)使用SELECT...LOCK IN SHARE MODE則會(huì)對(duì)讀取到A表的記錄加S鎖,兩個(gè)session在同時(shí)申請(qǐng)X鎖進(jìn)行更新時(shí)便發(fā)生死鎖。另外,由于讀取到了A表同一行內(nèi)容,兩個(gè)session在向同一表B插入數(shù)據(jù)時(shí)會(huì)導(dǎo)致鍵重復(fù)的錯(cuò)誤。這種情況下用LOCK IN SHARE MODE不是好的辦法,而使用SELECT...FOR UPDATE較合適,在讀取的時(shí)候阻塞其他事物的讀和更新請(qǐng)求。

到此,關(guān)于“Innodb鎖定讀是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI