什么是幻讀?
成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站設(shè)計制作、成都網(wǎng)站制作、網(wǎng)站頁面設(shè)計、網(wǎng)站優(yōu)化SEO優(yōu)化為一體的專業(yè)網(wǎng)絡(luò)公司,已為成都等多地近百家企業(yè)提供網(wǎng)站建設(shè)服務(wù)。追求良好的瀏覽體驗,以探求精品塑造與理念升華,設(shè)計最適合用戶的網(wǎng)站頁面。 合作只是第一步,服務(wù)才是根本,我們始終堅持講誠信,負責(zé)任的原則,為您進行細心、貼心、認真的服務(wù),與眾多客戶在蓬勃發(fā)展的市場環(huán)境中,互促共生。
幻讀指的是一個事務(wù)在前后兩次查詢同一個范圍的時候,后一次查詢看到了前一次查詢沒有看到的行。
首先快照讀是不存在幻讀的,只有當(dāng)前讀(實時讀)才存在幻讀的問題。
幻讀有什么問題?
select ...for update語句就是將相應(yīng)的數(shù)據(jù)行鎖住,但是如果存在幻讀,就把for update的語義破壞了。
如何解決幻讀?
產(chǎn)生幻讀的原因是,行鎖只能鎖住行,但是新插入記錄這個動作,要更新的是記錄之間的“間隙”。因此,為了解決幻讀問題,InnoDB只好引入新的鎖,也就是間隙鎖(Gap Lock)。間隙鎖和行鎖合稱 next-key lock , 每個next-key lock是前開后閉區(qū)間 。
總結(jié)
如果在transaction1(Tr1)進行一個
select * from table1 where id 4 lock in share mode.
這里會在table1上加一個next_key lock(間隙鎖),基本原理是什么呢?大致是這樣的,內(nèi)存中有一個lock hash。是一個key(類似于tableid+pageid+offset)到value(所加的鎖)--- 這就是行鎖的原理。所以 id4的話,會給0 1 2 4(假設(shè)當(dāng)前數(shù)據(jù)庫沒有3)加上行鎖,這樣就保證了不會出現(xiàn)插入id=3.5這種事情的發(fā)生。
Record Lock: 單個行記錄上的鎖
Gap Lock :間隙鎖,鎖定一個范圍,但不包含記錄本身
Next-Key Lock:Gap Lock + Record Lock,鎖定一個范圍,并且包含記錄本身
Record Lock會鎖住索引記錄,如果建表時沒有設(shè)置添加索引,Innodb會去鎖定隱式的主鍵。
本文死鎖場景皆為工作中遇到(或同事遇到)并解決的死鎖場景,寫這篇文章的目的是整理和分享,歡迎指正和補充,本文死鎖場景包括:
注 :以下場景隔離級別均為默認的Repeatable Read;
前提 :表 t_user 的 uid 字段創(chuàng)建了唯一索引,并擁有可更新字段age。
場景復(fù)現(xiàn) :
相應(yīng)業(yè)務(wù)案例和解決方案 :
該場景常見于事務(wù)中存在for循環(huán)更新某條記錄的情況,死鎖日志顯示 lock_mode X locks rec but not gap waiting (即行鎖而非間隙鎖),解決方案:
表結(jié)構(gòu) :
場景復(fù)現(xiàn) :
首先查詢表中目前存在的記錄:
執(zhí)行兩個事務(wù)的操作:
死鎖原因分析 :
解決方案 :
t_user結(jié)構(gòu)改造為:
場景復(fù)現(xiàn)操作(幾率不高) :
假設(shè)存在以下數(shù)據(jù) :
死鎖分析 :
事務(wù)1 :
① 鎖住zone_id=1對應(yīng)的間隙鎖: zoneId in (1,2)
② 鎖住索引zone_id=1對應(yīng)的主鍵索引行鎖id = [1,2]
③ 鎖住uid=1對應(yīng)的間隙鎖: uid in (1, 2)
④ 鎖住uid=1對應(yīng)的主鍵索引行鎖: id = [1, 3]
事務(wù)2 :
① 鎖住zone_id=2對應(yīng)的間隙鎖: zoneId in (1,2)
② 鎖住索引zone_id=2對應(yīng)的主鍵索引行鎖id = [3,4]
③ 鎖住uid=2對應(yīng)的間隙鎖: uid in (1, 2)
④ 鎖住uid=2對應(yīng)的主鍵索引行鎖: id = [2, 4]
解決方案 :創(chuàng)建聯(lián)合索引,使執(zhí)行計劃只會用到一個索引。
測試表結(jié)構(gòu) :
場景復(fù)現(xiàn)操作 :
解決辦法:盡量避免這種插入又回滾的場景。
避免死鎖的原則:
網(wǎng)站標(biāo)題:mysql間隙鎖怎么用 mysql臨鍵鎖和間隙鎖的區(qū)別
本文URL:http://muchs.cn/article42/hjspec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、網(wǎng)站內(nèi)鏈、、網(wǎng)站營銷、網(wǎng)站建設(shè)、網(wǎng)站設(shè)計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)