2022-09-17

2.3 讀-寫或?qū)?讀情況

<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">讀-寫</span>或<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">寫-讀</span>统倒,即一個事務進行讀取操作肤晓,另一個進行改動操作 安皱。這種情況下可能發(fā)生<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">臟讀</span>调鬓、<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">不可重復讀</span>、<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">幻讀</span>的問題酌伊。

各個數(shù)據(jù)庫廠商對<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">SQL</span>的支持都不能一樣腾窝。比如MySQL在<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">REPEATABLE READ</span>隔離級別上就已經(jīng)解決了<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">幻讀</span>問題。

2.4 并發(fā)問題的解決方案

怎么解決<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">臟讀</span>居砖、<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">不可重復讀</span>虹脯、<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">幻讀</span>這些問題呢?其實有兩種可選的解決方案:

  • 方案一:讀操作利用多版本并發(fā)控制(<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">MVCC</span>)奏候,寫操作進行<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">加鎖</span>归形。

    所謂的<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">MVCC</span>,就是生成一個ReadView鼻由,通過ReadView找到符合條件的記錄版本(歷史版本由undo日志構(gòu)建)暇榴。查詢語句只能<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">讀</span>到生成ReadView之前<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">已提交事務所做的更改</span>,在生成ReadView之前未提交的事務或者之后才開啟的事務所做的更改是看不到的蕉世。而<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">寫操作</span>肯定針對的是<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">最新版本的記錄</span>蔼紧,讀記錄的歷史版本和改動記錄的最新版本本身并不沖突,也就是采用MVCC時狠轻,<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">讀-寫</span>操作并不沖突奸例。

    普通的SELECT語句在READ COMMITED和REPEATABLE READ隔離級別下會使用到MVCC讀取記錄。
    - 在READ COMMITED隔離級別下向楼,一個事務在執(zhí)行過程中每次SELECT操作都會生成一個ReadView查吊,ReadView的存在本身就保證了事務不可以讀取未提交的事務所做的更改,也就是避免了臟讀現(xiàn)象湖蜕;
    - 在REPEATABLE READ隔離級別下逻卖,一個事務在執(zhí)行過程中只有第一次執(zhí)行SELECT操作才會生成一個ReadView,之后的SELECT操作都復用這個ReadView昭抒,這樣也就避免了不可重復讀和幻讀的問題评也。
    
  • 方案二:讀炼杖、寫操作都采用<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">加鎖</span>的方式。

    如果我們的一些業(yè)務場景不允許讀取記錄的舊版本盗迟,而是每次都必須去<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">讀取記錄的最新版本</span>坤邪。比如,在銀行存款的事務中罚缕,你需要先把賬戶的余額讀出來艇纺,然后將其加上本次存款的數(shù)額,最后再寫到數(shù)據(jù)庫中邮弹。在將賬戶余額讀取出來后喂饥,就不想讓別的事務再訪問改余額,直到本次存款事務執(zhí)行完成肠鲫,其他事務才可以訪問賬戶的余額。這樣在讀取記錄的時候就需要對其進行<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">加鎖</span>操作或粮,這樣也就意味這<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">讀</span>操作和<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">寫</span>操作也像<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">寫-寫</span>操作那樣<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">排隊執(zhí)行</span>导饲。

    <span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">臟讀</span>的產(chǎn)生原因是因為當前事務讀取了另外一個未提交事務寫的一條記錄,如果另一個事務在寫記錄的時候就給這條記錄加鎖氯材,那么當前事務就無法繼續(xù)讀取該記錄了渣锦,所以也就不會有臟讀問題的產(chǎn)生了。

    <span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">不可重復讀</span>的產(chǎn)生是因為當前事務先讀取一條記錄氢哮,另外一個事務對該記錄做了改動并提交之后袋毙,當前事務再次讀取時會獲得不同的值,如果在當前事務讀取記錄時就該該記錄加鎖冗尤,name另一個事務就無法修改該記錄听盖,自然也不會發(fā)生不可重復讀了。

    <span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">幻寫</span>問題的產(chǎn)生是因為當前事務讀取了一個范圍的記錄裂七,然后另外的事務向該范圍插入了新記錄皆看,當前事務再次讀取該范圍的記錄時發(fā)現(xiàn)了新插入的新紀錄。采用加鎖的方式解決了幻讀問題就有一些麻煩生真,因為當前事務在第一次讀取記錄時幻讀的記錄并不存在嗤形,所以讀取的時候加鎖不知道鎖那個記錄恩伺。

  • 對比:

    • 采用<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">MVCC</span>方式的話,<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">讀-寫</span>操作批次并不沖突毛雇,<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">性能更高</span>。
    • 采用<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">加鎖</span>方式的話侦镇,<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">讀-寫</span>操作彼此需要<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">排隊執(zhí)行</span>灵疮,影響性能。

    一般情況下我們愿意采用<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">MVCC</span>來解決<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">讀-寫</span>操作并發(fā)執(zhí)行的問題壳繁,但是業(yè)務在某些特殊情況下始藕,要求必須在<span style="color:#a27e22;background:#e9e9e9;font-size:16px;font-family:Helvetica;">加鎖</span>的方式執(zhí)行蒲稳。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市伍派,隨后出現(xiàn)的幾起案子江耀,更是在濱河造成了極大的恐慌,老刑警劉巖诉植,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祥国,死亡現(xiàn)場離奇詭異,居然都是意外死亡晾腔,警方通過查閱死者的電腦和手機舌稀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灼擂,“玉大人壁查,你說我怎么就攤上這事√抻Γ” “怎么了睡腿?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長峻贮。 經(jīng)常有香客問我席怪,道長,這世上最難降的妖魔是什么纤控? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任挂捻,我火速辦了婚禮,結(jié)果婚禮上船万,老公的妹妹穿的比我還像新娘刻撒。我一直安慰自己,他們只是感情好耿导,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布疫赎。 她就那樣靜靜地躺著,像睡著了一般碎节。 火紅的嫁衣襯著肌膚如雪捧搞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天狮荔,我揣著相機與錄音胎撇,去河邊找鬼。 笑死殖氏,一個胖子當著我的面吹牛晚树,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播雅采,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼爵憎,長吁一口氣:“原來是場噩夢啊……” “哼慨亲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宝鼓,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤刑棵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后愚铡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛉签,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年沥寥,在試婚紗的時候發(fā)現(xiàn)自己被綠了碍舍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡邑雅,死狀恐怖片橡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情淮野,我是刑警寧澤捧书,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站录煤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏荞胡。R本人自食惡果不足惜妈踊,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泪漂。 院中可真熱鬧廊营,春花似錦、人聲如沸萝勤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敌卓。三九已至慎式,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間趟径,已是汗流浹背瘪吏。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蜗巧,地道東北人掌眠。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像幕屹,于是被迫代替她去往敵國和親蓝丙。 傳聞我的和親對象是個殘疾皇子级遭,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容