這篇文章主要介紹“Innodb鎖定讀是什么”,在日常操作中,相信很多人在Innodb鎖定讀是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Innodb鎖定讀是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
目前成都創(chuàng)新互聯(lián)公司已為千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、成都網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計、南湖網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
InnoDB支持2種類型的鎖定讀:
1、SELECT ... LOCK IN SHARE MODE設(shè)置一個共享S鎖在被查詢的行上。其他會話能讀取這些行,但是不能修改相應(yīng)行的數(shù)據(jù),直到此事務(wù)結(jié)束。如果其他事務(wù)對相應(yīng)的行進行了DML操作,而未結(jié)束事務(wù)前,那當(dāng)前事務(wù)中進行SELECT ... LOCK IN SHARE MODE將一直等待,直到另外的事務(wù)完成。
2、SELECT ... FOR UPDATE設(shè)置一個排他X鎖在相應(yīng)的行上。按照索引進行select for update查詢時,會鎖住相關(guān)的索引條目和行數(shù)據(jù)。同樣的,此期間其他事務(wù)對相關(guān)的行進行更新、SELECT ... LOCK IN SHARE MODE、在某些事務(wù)隔離級別讀數(shù)據(jù)都將會被堵塞,但一致性讀會忽略存在的任何鎖,因為老版本的數(shù)據(jù)不能被鎖定,它們通過undo log在內(nèi)存中構(gòu)造數(shù)據(jù)的拷貝。
注意:使用鎖定讀操作的時候,必須開啟事務(wù)(可以通過START TRANSACTION或者set autocommit=0來開啟事務(wù)),鎖定讀相關(guān)的鎖在事務(wù)commit或者rollback時,都會立即釋放。如果沒有開啟事務(wù),則相關(guān)的行不會被鎖定。
用法舉例
假如要往子表插入一條記錄,插入前首先要確認(rèn)一下父表有無相關(guān)記錄,只有在父表有對應(yīng)記錄時插入才能滿足應(yīng)用數(shù)據(jù)的完整性約束。如果使用一致性非鎖定讀來檢查父表相應(yīng)的記錄,而在往子表插入對應(yīng)數(shù)據(jù)的瞬間,其他會話的事務(wù)剛好在你查詢父表之后插入子表之前刪除或者修改了剛才查到的行,這樣接下來的插入操作將可能會不能順利的完成。
可以使用LOCK IN SHARE MODE進行鎖定讀,來避免此潛在的問題。如下:
SELECT * FROM parent WHERE NAME = 'Jones' LOCK IN SHARE MODE;
在父表使用LOCK IN SHARE MODE進行查詢到j(luò)ones,此時你能安全的在子表中插入jones相關(guān)的數(shù)據(jù)。此期間如果有其他會話事務(wù)視圖DML父表中相應(yīng)的行將會被阻塞,直到你的完成你的操作后結(jié)束鎖定讀的事務(wù),這樣可以保證父表、子表的數(shù)據(jù)的一致性。
另外一個場景,如有兩個session需要讀取某表A中的一行,在成功讀取后在同一事務(wù)中更新該行,并在另外的表B中插入剛開始讀取到的行。若此時使用SELECT...LOCK IN SHARE MODE則會對讀取到A表的記錄加S鎖,兩個session在同時申請X鎖進行更新時便發(fā)生死鎖。另外,由于讀取到了A表同一行內(nèi)容,兩個session在向同一表B插入數(shù)據(jù)時會導(dǎo)致鍵重復(fù)的錯誤。這種情況下用LOCK IN SHARE MODE不是好的辦法,而使用SELECT...FOR UPDATE較合適,在讀取的時候阻塞其他事物的讀和更新請求。
到此,關(guān)于“Innodb鎖定讀是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
當(dāng)前名稱:Innodb鎖定讀是什么
分享網(wǎng)址:http://weahome.cn/article/jspiej.html