www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 公眾號精選 > 小林coding
[導(dǎo)讀]??大家好,我是小林。我之前寫過一篇數(shù)據(jù)庫事務(wù)的文章「?事務(wù)、事務(wù)隔離級別和MVCC」,這篇我說過什么是幻讀?;米x的定義我這里還得補充一句,幻讀僅專指“新插入的行”,中途通過update更新數(shù)據(jù)而出現(xiàn)同一個事務(wù)前后兩次查詢的「結(jié)果集合」不一樣,這種不算幻讀。然后前幾天有位讀者跟我...

?

?大家好,我是小林。

我之前寫過一篇數(shù)據(jù)庫事務(wù)的文章「?事務(wù)、事務(wù)隔離級別和MVCC」,這篇我說過什么是幻讀?;米x的定義我這里還得補充一句,幻讀僅專指“新插入的行”,中途通過 update 更新數(shù)據(jù)而出現(xiàn)同一個事務(wù)前后兩次查詢的「結(jié)果集合」不一樣,這種不算幻讀。然后前幾天有位讀者跟我說,這個幻讀例子不是已經(jīng)被「可重復(fù)讀」隔離級別解決了嗎?為什么還要有 next-key 呢?他有這個質(zhì)疑,是因為他做了這個實驗。實驗的數(shù)據(jù)庫表 t_stu 如下,其中 id 為主鍵。
然后在可重復(fù)讀隔離級別下,有兩個事務(wù)的執(zhí)行順序如下:
從這個實驗結(jié)果可以看到,即使事務(wù) B 中途插入了一條記錄,事務(wù) A 前后兩次查詢的結(jié)果集都是一樣的,并沒有出現(xiàn)所謂的幻讀現(xiàn)象。讀者做的實驗之所以看不到幻讀現(xiàn)象,是因為在可重復(fù)讀隔離級別下,普通的查詢是快照讀,是不會看到別的事務(wù)插入的數(shù)據(jù)的??芍貜?fù)讀隔離級是由 MVCC(多版本并發(fā)控制)實現(xiàn)的,實現(xiàn)的方式是啟動事務(wù)后,在執(zhí)行第一個查詢語句后,會創(chuàng)建一個視圖,然后后續(xù)的查詢語句都用這個視圖,「快照讀」讀的就是這個視圖的數(shù)據(jù),視圖你可以理解為版本數(shù)據(jù),這樣就使得每次查詢的數(shù)據(jù)都是一樣的。MySQL 里除了普通查詢是快照度,其他都是當(dāng)前讀,比如update、insert、delete,這些語句執(zhí)行前都會查詢最新版本的數(shù)據(jù),然后再做進(jìn)一步的操作。這很好理解,假設(shè)你要 update 一個記錄,另一個事務(wù)已經(jīng) delete 這條記錄并且 提交事務(wù)了,這樣不是會產(chǎn)生沖突嗎,所以 update 的時候肯定要知道最新的數(shù)據(jù)。另外,select ... for update?這種查詢語句是當(dāng)前讀,每次執(zhí)行的時候都是讀取最新的數(shù)據(jù)。?因此,要討論「可重復(fù)讀」隔離級別的幻讀現(xiàn)象,是要建立在「當(dāng)前讀」的情況下。接下來,我們假設(shè)select ... for update當(dāng)前讀是不會加鎖的(實際上是會加鎖的),在做一遍讀者那個實驗。這時候,事務(wù) B 插入的記錄,就會被事務(wù) A 的第二條查詢語句查詢到(因為是當(dāng)前讀),這樣就會出現(xiàn)前后兩次查詢的結(jié)果集合不一樣,這就出現(xiàn)了幻讀。所以,Innodb 引擎為了解決「可重復(fù)讀」隔離級別使用「當(dāng)前讀」而造成的幻讀問題,就引出了 next-key 鎖,就是記錄鎖和間隙鎖的組合。
  • 記錄鎖,鎖的是記錄本身;

  • 間隙鎖,鎖的就是兩個值之間的空隙,以防止其他事務(wù)在這個空隙間插入新的數(shù)據(jù),從而避免幻讀現(xiàn)象。

比如,下面事務(wù) A 查詢語句會鎖住(2, ∞]范圍的記錄,然后期間如果有其他事務(wù)在這個鎖住的范圍插入數(shù)據(jù)就會被阻塞。next-key 鎖的加鎖規(guī)則其實挺復(fù)雜的,在一些場景下會退化成記錄鎖或間隙鎖,我之前也寫一篇加鎖規(guī)則,詳細(xì)可以看這篇「我做了一天的實驗!」需要注意的是,next-key lock 鎖的是索引,而不是數(shù)據(jù)本身,所以如果 update 語句的 where 條件沒有用到索引列,那么就會全表掃描,在一行行掃描的過程中,不僅給行加上了行鎖,還給行兩邊的空隙也加上了間隙鎖,相當(dāng)于鎖住整個表,然后直到事務(wù)結(jié)束才會釋放鎖。所以在線上千萬不要執(zhí)行沒有帶索引條件的 update 語句,不然會造成業(yè)務(wù)停滯,我有個讀者就因為干了這個事情,然后被老板教育了一波,詳細(xì)可以看這篇「完蛋,公司被一條 update 語句干趴了!」好了,這次就聊到這啦,有不明白的地方歡迎討論!??

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉
關(guān)閉