国产睡熟迷奷白丝护士系列精品,中文色字幕网站,免费h网站在线观看的,亚洲开心激情在线

      <sup id="hb9fh"></sup>
          1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機構(gòu)

            手機站
            千鋒教育

            千鋒學習站 | 隨時隨地免費學

            千鋒教育

            掃一掃進入千鋒手機站

            領(lǐng)取全套視頻
            千鋒教育

            關(guān)注千鋒學習站小程序
            隨時隨地免費學習課程

            當前位置:首頁  >  技術(shù)干貨  > MYSQL的幻讀和我們平常說的幻讀有什么區(qū)別?

            MYSQL的幻讀和我們平常說的幻讀有什么區(qū)別?

            來源:千鋒教育
            發(fā)布人:xqq
            時間: 2023-10-13 19:58:38 1697198318

            一、MYSQL的幻讀和我們平常說的幻讀有什么區(qū)別

            平常說的幻讀

            事務(wù)1查詢id<10的記錄時,返回了2條記錄,接著事務(wù)2插入了一條id為3的記錄,并提交。接著事務(wù)1查詢id<10的記錄時,返回了3條記錄,結(jié)果多了一條數(shù)據(jù)。由于Mysql存在MVCC,解決了這種情況下的幻讀。

            Mysql的幻讀

            Mysql的幻讀,并不是說兩次讀取獲取的結(jié)果集不同,幻讀側(cè)重的方面是某一次的 select 操作得到的結(jié)果所表征的數(shù)據(jù)狀態(tài)無法支撐后續(xù)的業(yè)務(wù)操作。更為具體一些:select 某記錄是否存在,不存在,準備插入此記錄,但執(zhí)行 insert 時發(fā)現(xiàn)此記錄已存在,無法插入,此時就發(fā)生了幻讀。

            舉個例子:事務(wù)T1:

            事務(wù)T2:

            step1 T1: SELECT * FROM users WHERE id = 1;step2 T2: INSERT INTO users VALUES (1, ‘big cat’);step3 T1: INSERT INTO users VALUES (1, ‘big cat’);step4 T1: SELECT * FROM users WHERE id = 1;T1 :主事務(wù),檢測表中是否有 id 為 1 的記錄,沒有則插入,這是我們期望的正常業(yè)務(wù)邏輯。T2 :干擾事務(wù),目的在于擾亂 T1 的正常的事務(wù)執(zhí)行。

            在 RR 隔離級別下,step1、step2 是會正常執(zhí)行的,step3 則會報錯主鍵沖突,對于 T1 的業(yè)務(wù)來說是執(zhí)行失敗的,這里 T1 就是發(fā)生了幻讀,因為 T1 在 step1 中讀取的數(shù)據(jù)狀態(tài)并不能支撐后續(xù)的業(yè)務(wù)操作,T1:“見鬼了,我剛才讀到的結(jié)果應(yīng)該可以支持我這樣操作才對啊,為什么現(xiàn)在不可以”。T1 不敢相信的又執(zhí)行了 step4,發(fā)現(xiàn)和 setp1 讀取的結(jié)果是一樣的(RR下的 MMVC機制)。此時,幻讀無疑已經(jīng)發(fā)生,T1 無論讀取多少次,都查不到 id = 1 的記錄,但它的確無法插入這條他通過讀取來認定不存在的記錄(此數(shù)據(jù)已被T2插入),對于 T1 來說,它幻讀了。其實產(chǎn)生幻讀的原因就是:行鎖只能鎖住行,即使把所有的行記錄都上鎖,也阻止不了新插入的記錄。

            二、MySQL 是如何解決幻讀的

            1、多版本并發(fā)控制(MVCC)(快照讀/一致性讀)

            多數(shù)數(shù)據(jù)庫都實現(xiàn)了多版本并發(fā)控制,并且都是靠保存數(shù)據(jù)快照來實現(xiàn)的。以?InnoDB?為例??梢岳斫鉃槊恳恍兄卸既哂嗔藘蓚€字段,一個是行的創(chuàng)建版本,一個是行的刪除(過期)版本。具體的版本號(trx_id)存在?information_schema.INNODB_TRX?表中。版本號(trx_id)隨著每次事務(wù)的開啟自增。事務(wù)每次取數(shù)據(jù)的時候都會取創(chuàng)建版本小于當前事務(wù)版本的數(shù)據(jù),以及過期版本大于當前版本的數(shù)據(jù)。普通的 select 就是快照讀。

            select * from T where number = 1;

            原理:將歷史數(shù)據(jù)存一份快照,所以其他事務(wù)增加與刪除數(shù)據(jù),對于當前事務(wù)來說是不可見的。

            2、next-key 鎖 (當前讀)

            next-key 鎖包含兩部分

            記錄鎖(行鎖)間隙鎖

            記錄鎖是加在索引上的鎖,間隙鎖是加在索引之間的。(思考:如果列上沒有索引會發(fā)生什么?)

            select * from T where number = 1 for update;select * from T where number = 1 lock in share mode;insertupdatedelete

            原理:將當前數(shù)據(jù)行與上一條數(shù)據(jù)和下一條數(shù)據(jù)之間的間隙鎖定,保證此范圍內(nèi)讀取的數(shù)據(jù)是一致的。

            3、MySQL InnoDB 引擎 RR 隔離級別是否解決了幻讀

            Mysql官方給出的幻讀解釋是:只要在一個事務(wù)中,第二次select多出了row就算幻讀。a事務(wù)先select,b事務(wù)insert確實會加一個gap鎖,但是如果b事務(wù)commit,這個gap鎖就會釋放(釋放后a事務(wù)可以隨意dml操作),a事務(wù)再select出來的結(jié)果在MVCC下還和名列前茅次select一樣,接著a事務(wù)不加條件地update,這個update會作用在所有行上(包括b事務(wù)新加的),a事務(wù)再次select就會出現(xiàn)b事務(wù)中的新行,并且這個新行已經(jīng)被update修改了,實測在RR級別下確實如此。如果這樣理解的話,Mysql的RR級別確實防不住幻讀。

            在快照讀讀情況下,mysql通過mvcc來避免幻讀。
            在當前讀讀情況下,mysql通過next-key來避免幻讀。

            select * from t where a=1;屬于快照讀
            select * from t where a=1 lock in share mode;屬于當前讀

            不能把快照讀和當前讀得到的結(jié)果不一樣這種情況認為是幻讀,這是兩種不同的使用方式。所以我認為mysql的rr級別是解決了幻讀的。

            先說結(jié)論,MySQL?存儲引擎?InnoDB?隔離級別?RR?解決了幻讀問題。不能把快照讀和當前讀得到的結(jié)果不一樣這種情況認為是幻讀,這是兩種不同的使用方式。所以認為?MySQL?的?RR?級別是解決了幻讀的。先說結(jié)論,MySQL?存儲引擎?InnoDB?隔離級別?RR?解決了幻讀問題。

            如引用一問題所說,T1?select?之后?update,會將 T2 中?insert?的數(shù)據(jù)一起更新,那么認為多出來一行,所以防不住幻讀。但是其實這種方式是一種?bad case。如圖:

            延伸閱讀1:MySQL簡介

            MySQL是一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB 公司開發(fā),屬于 Oracle 旗下產(chǎn)品。MySQL 是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一,在 WEB 應(yīng)用方面,MySQL是較好的 RDBMS (Relational Database Management System,關(guān)系數(shù)據(jù)庫管理系統(tǒng)) 應(yīng)用軟件之一。

            聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
            10年以上業(yè)內(nèi)強師集結(jié),手把手帶你蛻變精英
            請您保持通訊暢通,專屬學習老師24小時內(nèi)將與您1V1溝通
            免費領(lǐng)取
            今日已有369人領(lǐng)取成功
            劉同學 138****2860 剛剛成功領(lǐng)取
            王同學 131****2015 剛剛成功領(lǐng)取
            張同學 133****4652 剛剛成功領(lǐng)取
            李同學 135****8607 剛剛成功領(lǐng)取
            楊同學 132****5667 剛剛成功領(lǐng)取
            岳同學 134****6652 剛剛成功領(lǐng)取
            梁同學 157****2950 剛剛成功領(lǐng)取
            劉同學 189****1015 剛剛成功領(lǐng)取
            張同學 155****4678 剛剛成功領(lǐng)取
            鄒同學 139****2907 剛剛成功領(lǐng)取
            董同學 138****2867 剛剛成功領(lǐng)取
            周同學 136****3602 剛剛成功領(lǐng)取
            相關(guān)推薦HOT
            快速通道