HOME 首頁(yè)
SERVICE 服務(wù)產(chǎn)品
XINMEITI 新媒體代運(yùn)營(yíng)
CASE 服務(wù)案例
NEWS 熱點(diǎn)資訊
ABOUT 關(guān)于我們
CONTACT 聯(lián)系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    可重復(fù)使用怎么讀(可重復(fù)使用的英語(yǔ)怎么寫)

    發(fā)布時(shí)間:2023-04-07 11:11:46     稿源: 創(chuàng)意嶺    閱讀: 141        

    大家好!今天讓創(chuàng)意嶺的小編來(lái)大家介紹下關(guān)于可重復(fù)使用怎么讀的問(wèn)題,以下是小編對(duì)此問(wèn)題的歸納整理,讓我們一起來(lái)看看吧。

    開始之前先推薦一個(gè)非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對(duì)話答疑等等

    只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁(yè)版、PC客戶端

    官網(wǎng):https://ai.de1919.com。

    創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請(qǐng)撥打電話175-8598-2043,或添加微信:1454722008

    本文目錄:

    可重復(fù)使用怎么讀(可重復(fù)使用的英語(yǔ)怎么寫)

    一、mysql 解決可提交讀、可重復(fù)讀、幻讀

    這張圖本人覺(jué)得總結(jié)得挺好的,在一般的互聯(lián)網(wǎng)項(xiàng)目中,基本上用的都是Innodb引擎,一般只涉及到的都是行級(jí)鎖,但是如果sql語(yǔ)句中不帶索引進(jìn)行操作,可能會(huì)導(dǎo)致鎖表,這是不推薦的,性能非常低,可能會(huì)導(dǎo)致全表掃描等,行鎖的具體實(shí)現(xiàn)算法有以下幾種mysql特有的鎖:

    Record Lock(記錄鎖):單個(gè)行記錄的鎖,一般是唯一索引或者主鍵上的加鎖

    Gap Lock(間隙鎖):鎖定一個(gè)區(qū)間,但是不包括自身,開區(qū)間的鎖,RR級(jí)別才會(huì)有間隙鎖,間隙鎖的唯一目的是防止區(qū)間數(shù)據(jù)的插入,所以間隙鎖與間隙鎖之間是不會(huì)相互阻塞的

    Next-key Lock(臨鍵鎖):與間隙鎖的區(qū)別是包括自身,是左開右閉區(qū)間,RR級(jí)別才會(huì)有

    加鎖規(guī)則里面,包含了兩個(gè)“原則”、兩個(gè)“優(yōu)化”和一個(gè)“bug”。

    原則 1:加鎖的基本單位是 next-key lock,希望你還記得,next-key lock 是前開后閉區(qū)間。

    原則 2:查找過(guò)程中訪問(wèn)到的對(duì)象才會(huì)加鎖。

    優(yōu)化 1:索引上的等值查詢,給唯一索引加鎖的時(shí)候,next-key lock 退化為行鎖。

    優(yōu)化 2:索引上的等值查詢,向右遍歷時(shí)且最后一個(gè)值不滿足等值條件的時(shí)候,next-key lock 退化為間隙鎖。

    一個(gè) bug:唯一索引上的范圍查詢會(huì)訪問(wèn)到不滿足條件的第一個(gè)值為止。

    舉例來(lái)說(shuō)明上述的原則:

    建表

    插入數(shù)據(jù):

    INSERT INTO t ( id , c , d ) VALUES (0, 0, 0);

    INSERT INTO t ( id , c , d ) VALUES (5, 5, 10);

    INSERT INTO t ( id , c , d ) VALUES (10, 10, 10);

    INSERT INTO t ( id , c , d ) VALUES (15, 15, 15);

    INSERT INTO t ( id , c , d ) VALUES (20, 20, 20);

    INSERT INTO t ( id , c , d ) VALUES (25, 25, 25);

    例子1:鎖表

    因?yàn)閐字段上沒(méi)有建索引,所以涉及該字段的查詢加鎖會(huì)鎖住整個(gè)表

    因?yàn)閐字段上面沒(méi)有建立索引,所以事務(wù)1執(zhí)行后會(huì)導(dǎo)致整個(gè)表被鎖,后面所有的操作都會(huì)在等待整個(gè)表鎖被釋放

    例子2:主鍵/唯一索引 記錄鎖

    id字段為主鍵,而且事務(wù)1查詢命中了唯一的記錄,默認(rèn)是加Next-key Lock,區(qū)間是(0,5],但是根據(jù)優(yōu)化1,唯一索引/主鍵上的等值查詢,會(huì)退化為行鎖,所以只會(huì)鎖5這個(gè)記錄。

    例子3:主鍵/唯一索引上的間隙鎖

    由于表 t 中沒(méi)有 id=7 的記錄,所以用我們上面提到的加鎖規(guī)則判斷一下的話:根據(jù)原則 1,加鎖單位是 next-key lock,事務(wù)1加鎖范圍就是 (5,10];同時(shí)根據(jù)優(yōu)化 2,這是一個(gè)等值查詢 (id=7),而 id=10 不滿足查詢條件,next-key lock 退化成間隙鎖,因此最終加鎖的范圍是 (5,10),所以事務(wù)2會(huì)阻塞,事務(wù)3執(zhí)行成功。

    例子4:普通索引上的間隙鎖

    c字段是普通索引,事務(wù)1執(zhí)行時(shí)默認(rèn)是對(duì)區(qū)間(0,5]加間隙鎖,根據(jù)優(yōu)化2,非唯一索引/主鍵會(huì)繼續(xù)向右遍歷,找到10,所以最終的加鎖為(0,5]的Next-Key鎖+(5,10)的間隙鎖,所以事務(wù)2阻塞,事務(wù)3成功。

    例子5:間隙鎖與行鎖

    事務(wù)1默認(rèn)的Next-Key鎖區(qū)間是(0,5],根據(jù)優(yōu)化2會(huì)向右遍歷,找到不滿足查詢條件的10,退化成間隙鎖,所以事務(wù)1的鎖是(0,5]的Next-Key鎖+(5,10)的間隙鎖,這兩個(gè)鎖與行鎖是沖突的,而事務(wù)2申請(qǐng)的Next-Key鎖是和事務(wù)1一樣,但是c=5的行鎖與事務(wù)1沖突,所以產(chǎn)生了阻塞,如果改為update t set d=1000 where c=6;因?yàn)榇藭r(shí)產(chǎn)生的間隙鎖為(5,10),而間隙鎖與間隙鎖是不沖突的,不會(huì)產(chǎn)生阻塞

    例子6:lock in share mode鎖覆蓋索引

    事務(wù)1存在覆蓋索引的情況,不會(huì)去回表,lock in share mode這種情況下只會(huì)鎖c字段索引,而事務(wù)2是對(duì)主鍵加行鎖,所以兩者不存在沖突。

    例子7:主鍵/唯一索引上的范圍查詢

    開始執(zhí)行的時(shí)候,要找到第一個(gè) id=10 的行,因此本該是 Next-Key Lock(5,10],根據(jù)優(yōu)化 1, 主鍵 id 上的等值條件,退化成行鎖,只加了 id=10 這一行的行鎖。范圍查找就往后繼續(xù)找,找到 id=15 這一行停下來(lái),因此需要加 Next-Key Lock(10,15],所以事務(wù)3是沖突的。

    例子8:普通索引上的范圍查詢

    開始執(zhí)行時(shí),找到第一個(gè)滿足條件的行10,加鎖Next-Key Lock(5,10],因?yàn)椴皇俏ㄒ凰饕?,所以不?huì)退化,繼續(xù)向后面找,找到15這一行停下來(lái),因此需要加 Next-Key Lock(10,15],因?yàn)槭欠秶樵儯枣i不會(huì)退化。

    快照讀: 通過(guò)MVCC實(shí)現(xiàn),該技術(shù)不僅可以保證innodb的可重復(fù)讀,而且可以防止幻讀,但是他讀取的數(shù)據(jù)雖然是一致的,但是數(shù)據(jù)是歷史數(shù)據(jù)。

    簡(jiǎn)單的select操作(不包括 select … lock in share mode, select … for update)

    當(dāng)前讀: 要做到保證數(shù)據(jù)是一致的,同時(shí)讀取的數(shù)據(jù)是最新的數(shù)據(jù),innodb提供了next-key lock,即gap鎖與行鎖結(jié)合來(lái)實(shí)現(xiàn)。

    select … lock in share mode

    select … for update

    insert

    update

    delete

    自己理解:

    簡(jiǎn)單的select是快照讀,快照讀實(shí)現(xiàn)可提交讀,可重復(fù)讀和幻讀是通過(guò)MVCC+ReadView實(shí)現(xiàn)的,而當(dāng)前讀實(shí)現(xiàn)這幾種是通過(guò)鎖來(lái)實(shí)現(xiàn)的,為了說(shuō)明具體原理,下面介紹下MVCC和ReadView概念,所以簡(jiǎn)單的select是通過(guò)樂(lè)觀鎖實(shí)現(xiàn)的,當(dāng)前讀是通過(guò)悲觀鎖實(shí)現(xiàn)的。

    參考文章:

    https://www.sohu.com/a/302045871_411876

    https://www.jianshu.com/p/d1aba64b5c03

    https://www.jianshu.com/p/32904ee07e56

    二、蒸汽眼罩可以重復(fù)使用嗎?循環(huán)使用的效果怎么樣?

    蒸汽眼罩一般分為一次性、插電式和加熱式三種。很多人都很困惑,蒸汽眼罩可以重復(fù)使用嗎?蒸汽眼罩可以回收嗎?

    可重復(fù)使用怎么讀(可重復(fù)使用的英語(yǔ)怎么寫)

    蒸汽眼罩可以重復(fù)使用嗎?

    有兩種類型的蒸汽眼罩,一次性和可重復(fù)使用。可以根據(jù)自己的需求購(gòu)買。蒸汽眼罩一般設(shè)計(jì)成片狀,眼睛幾乎看不到的微小溫?zé)嵴羝浕つw,緩解疲勞。舒適快速——接駁溫度40℃左右,持續(xù)5-10分鐘,會(huì)讓你身心舒暢。一次性,方便,衛(wèi)生,快捷。攜帶方便,隨時(shí)隨地都可以使用。比如睡前、閑暇時(shí)、課間休息時(shí)、午休時(shí)、坐飛機(jī)、火車時(shí)、辦公室休息時(shí)等。

    蒸汽眼罩可以回收嗎?

    一次性蒸汽眼罩不能回收。蒸汽眼罩和普通眼罩不一樣,一是一次性,重復(fù)使用不衛(wèi)生,二是不能產(chǎn)生溫度,沒(méi)用。蒸汽眼罩一般分為一次性、插裝版和微波加熱版三種。

    可重復(fù)使用怎么讀(可重復(fù)使用的英語(yǔ)怎么寫)

    眼睛頭暈不舒服很累怎么辦?

    1.調(diào)節(jié)光線:在弱光下閱讀不會(huì)傷害眼睛,但如果光線不能提供足夠的明暗對(duì)比,就會(huì)使眼睛容易疲勞。你應(yīng)該使用能提供明暗對(duì)比的柔和光線,不要使用直接將光線反射到人眼睛的電燈。

    2.適時(shí)休息:如果連續(xù)在電腦前工作6-8小時(shí),每隔2-3小時(shí)休息一次。喝杯咖啡,上個(gè)廁所,或者只是把視線從電腦上移開10-15分鐘。

    3.調(diào)節(jié)電腦屏幕的亮度:電腦屏幕上的字體和數(shù)字就像小燈泡一樣,直接把光線射入你的眼睛。所以你需要調(diào)低屏幕亮度,調(diào)整明暗對(duì)比,讓字體清晰。

    可重復(fù)使用怎么讀(可重復(fù)使用的英語(yǔ)怎么寫)

    4.讓眼睛好好休息:緩解眼睛疲勞最好的方法就是讓眼睛休息,比你想象的簡(jiǎn)單。打電話的時(shí)候可以閉著眼睛。如果你不需要讀或?qū)懯裁?,那么你可以閉上眼睛,一邊聊天一邊休息。

    5.練習(xí)瑜伽:瑜伽不僅是一種洞察靈魂的方式,也是恢復(fù)視力的好方法。

    6.用茶敷眼睛:將毛巾浸泡在小米草茶中,平躺,將這條溫?zé)岬拿矸笤谘劬ι?0-15分鐘。這會(huì)使你的眼睛疲勞,但注意不要讓茶水流到眼睛里。同時(shí)讓小米草茶涼一會(huì)再用毛巾泡。

    7.用手熱敷眼睛:搓手至熱。然后,閉上眼睛,用手掌遮住眼睛。不要壓眼睛,捂眼睛。慢慢呼吸,想象黑暗。每天這樣做20分鐘,有助于緩解眼睛疲勞。

    8.經(jīng)常眨眼:眼瞼是你眼睛的私人按摩師。每天眨眼300次,有助于清潔眼睛,并給眼睛一點(diǎn)按摩。

    三、可重復(fù)讀實(shí)現(xiàn)

    事務(wù)指的就是一系列原子性的操作,這些操作要么全做,要么全都不做。事務(wù)是由引擎層支持的,而MylSAM不支持事務(wù),InnoDB支持事務(wù)。

    事務(wù)的隔離性是指事務(wù)之間互不干擾,相互隔離。Mysql有四種隔離級(jí)別,分別是未提交讀,提交讀,可重復(fù)讀和串行化。

    在Mysql中,事務(wù)更新時(shí),會(huì)記錄回滾操作。下圖就是將1改成2,2改成3,3改成4對(duì)應(yīng)的回滾記錄。

    同一條記錄存在不同版本,這就是MVVC,一個(gè)事務(wù)可以通過(guò)回滾操作得到該事務(wù)想要的版本

    當(dāng)系統(tǒng)中沒(méi)有比當(dāng)前回滾更早的read-view時(shí),回滾日志會(huì)被刪除,因此最好不要用長(zhǎng)事務(wù),因?yàn)闀?huì)導(dǎo)致大量回滾日志無(wú)法刪除,占用大量空間。

    set autocommit=1是顯示啟動(dòng)事務(wù)的方式,啟動(dòng)事務(wù)時(shí)用begin /start transaction,提交是commit,回滾用rollback。如果設(shè)置為set autocommit=0,那么執(zhí)行select時(shí)會(huì)創(chuàng)建事務(wù),而且如果是長(zhǎng)連接,事務(wù)沒(méi)有提交則不會(huì)自動(dòng)提交,造成長(zhǎng)事務(wù)。所以最好使用set autocommit =1。使用commit work and chain可以再下一次事務(wù)自動(dòng)開啟。

    四、mysql是如何實(shí)現(xiàn)可重復(fù)讀的?

    一個(gè)事務(wù)要更新一行,如果剛好有另外一個(gè)事務(wù)擁有這一行的行鎖,會(huì)被鎖住,進(jìn)入等待狀態(tài)。既然進(jìn)入了等待狀態(tài),那么等到這個(gè)事務(wù)自己獲取到行鎖要更新數(shù)據(jù)的時(shí)候,它讀到的值又是什么呢?

    可重復(fù)讀隔離級(jí)別下,事務(wù)在啟動(dòng)的時(shí)候就“拍了個(gè)整個(gè)庫(kù)的快照”。如果一個(gè)庫(kù)有100G,那么我啟動(dòng)一個(gè)事務(wù),MySQL就要拷⻉100G的數(shù)據(jù)出來(lái),這個(gè)過(guò)程得多慢啊。但是平時(shí)事務(wù)執(zhí)行起來(lái)卻是非??斓?。不是全部拷貝出來(lái)那是怎么實(shí)現(xiàn)的呢?

    InnoDB里面每個(gè)事務(wù)有一個(gè)唯一的事務(wù)ID,叫作transaction id。它是在事務(wù)開始的時(shí)候向InnoDB的事務(wù)系統(tǒng)申請(qǐng)的,是按申請(qǐng)順序嚴(yán)格遞增的。

    而每行數(shù)據(jù)也都是有多個(gè)版本的。每次事務(wù)更新數(shù)據(jù)的時(shí)候,都會(huì)生成一個(gè)新的數(shù)據(jù)版本,并且把transaction id賦值給這個(gè)數(shù) 據(jù)版本的事務(wù)ID,記為row trx_id。同時(shí),舊的數(shù)據(jù)版本要保留,并且在新的數(shù)據(jù)版本中,能夠有信息可以直接拿到它。

    數(shù)據(jù)表中的一行記錄,其實(shí)可能有多個(gè)版本(row),每個(gè)版本有自己的row trx_id。

    圖中虛線框里是同一行數(shù)據(jù)的4個(gè)版本,當(dāng)前最新版本是V4,k的值是22,它是被transaction id 為25的事務(wù)更新的,因此它的row trx_id也是25。語(yǔ)句更新會(huì)生成undo log(回滾日志),圖中的三個(gè)虛線箭頭,就是undo log。

    按照可重復(fù)讀的定義,一個(gè)事務(wù)啟動(dòng)的時(shí)候,能夠看到所有已經(jīng)提交的事務(wù)結(jié)果。但是之后,這個(gè)事務(wù)執(zhí)行期間,其他事務(wù)的更新對(duì)它不可⻅。

    一個(gè)事務(wù)只需要在啟動(dòng)的時(shí)候聲明說(shuō),“以我啟動(dòng)的時(shí)刻為準(zhǔn),如果一個(gè)數(shù)據(jù)版本是在我啟動(dòng)之前生成的,就認(rèn);如果是我啟動(dòng)以后才生成的,我就不認(rèn),我必須要找到它的上一個(gè)版本”。

    如果“上一個(gè)版本”也不可⻅,那就得繼續(xù)往前找。如果是這個(gè)事務(wù)自己更新的數(shù)據(jù),它自己還是要認(rèn)的。

    在實(shí)現(xiàn)上, InnoDB為每個(gè)事務(wù)構(gòu)造了一個(gè)數(shù)組,用來(lái)保存這個(gè)事務(wù)啟動(dòng)瞬間,當(dāng)前正在“活躍”的所有事務(wù)ID。“活躍”指的就 是,啟動(dòng)了但還沒(méi)提交。數(shù)組里面事務(wù)ID的最小值記為低水位,當(dāng)前系統(tǒng)里面已經(jīng)創(chuàng)建過(guò)的事務(wù)ID的最大值加1記為高水位。 這個(gè)視圖數(shù)組和高水位,就組成了當(dāng)前事務(wù)的一致性視圖(read-view)。而數(shù)據(jù)版本的可⻅性規(guī)則,就是基于數(shù)據(jù)的row trx_id和這個(gè)一致性視圖的對(duì)比結(jié)果得到的。

    InnoDB利用了“所有數(shù)據(jù)都有多個(gè)版本”的這個(gè)特性,實(shí)現(xiàn)了“秒級(jí)創(chuàng)建快照”的能力。

    回到我們最開始的表格,看看最后執(zhí)行的結(jié)果是多少。做如下假設(shè):

    事務(wù)A的視圖數(shù)組就是[99,100], 事務(wù)B的視圖數(shù)組是[99,100,101], 事務(wù)C的視圖數(shù)組是[99,100,101,102]。為了簡(jiǎn)化分析,我先把其他干擾語(yǔ)句去掉,只畫出跟事務(wù)A查詢邏輯有關(guān)的操作:

    第一個(gè)有效更新是事務(wù)C,把數(shù)據(jù)從(1,1)改成了(1,2)。這時(shí)候,這個(gè)數(shù)據(jù)的最新版本的row trx_id是102,而90這個(gè)版本已經(jīng)成為了歷史版本。 第二個(gè)有效更新是事務(wù)B,把數(shù)據(jù)從(1,2)改成了(1,3)。這時(shí)候,這個(gè)數(shù)據(jù)的最新版本(即row trx_id)是101,而102又成為了歷史版本。

    事務(wù)B的update語(yǔ)句,如果按照一致性讀,好像結(jié)果不對(duì)哦?

    事務(wù)B的視圖數(shù)組是先生成的,之后事務(wù)C才提交,不是應(yīng)該看不⻅(1,2)嗎,怎么能算出(1,3)來(lái)?

    事務(wù)B在更新之前查詢一次數(shù)據(jù),這個(gè)查詢返回的k的值確實(shí)是1。 但是,當(dāng)它要去更新數(shù)據(jù)的時(shí)候,就不能再在歷史版本上更新了,否則事務(wù)C的更新就丟失了。因此,事務(wù)B此時(shí)的set k=k+1是在(1,2)的基礎(chǔ)上進(jìn)行的操作。 所以,這里就用到了這樣一條規(guī)則:更新數(shù)據(jù)都是先讀后寫的,而這個(gè)讀,只能讀當(dāng)前的值,稱為 “當(dāng)前讀” ( current read )。

    在更新的時(shí)候,當(dāng)前讀拿到的數(shù)據(jù)是(1,2),更新后生成了新版本的數(shù)據(jù)(1,3),這個(gè)新版本的row trx_id是101。

    所以,在執(zhí)行事務(wù)B查詢語(yǔ)句的時(shí)候,一看自己的版本號(hào)是101,最新數(shù)據(jù)的版本號(hào)也是101,是自己的更新,可以直接使用, 所以查詢得到的k的值是3。

    select語(yǔ)句如果加鎖,也是當(dāng)前讀。

    如果把事務(wù)A的查詢語(yǔ)句select * from t where id=1修改一下,加上lock in share mode 或 for update,也都可以讀到版本號(hào)是101的數(shù)據(jù),返回的k的值是3。下面這兩個(gè)select語(yǔ)句,就是分別加了讀鎖(S鎖,共享鎖)和寫鎖(X鎖,排他鎖)。

    事務(wù)C’的不同是,更新后并沒(méi)有⻢上提交,在它提交前,事務(wù)B的更新語(yǔ)句先發(fā)起了。前面說(shuō)過(guò)了,雖然事務(wù)C’還沒(méi)提交,但是(1,2)這個(gè)版本也已經(jīng)生成了,并且是當(dāng)前的最新版本。那么,事務(wù)B的更新語(yǔ)句會(huì)怎么處理呢?

    兩階段鎖協(xié)議,事務(wù)C’沒(méi)提交,也就是說(shuō)(1,2)這個(gè)版本上的寫鎖還沒(méi)釋放。 而事務(wù)B是當(dāng)前讀,必須要讀最新版本,而且必須加鎖,因此就被鎖住了,必須等到事務(wù)C’釋放這個(gè)鎖,才能繼續(xù)它的當(dāng)前讀。

    回到最初的問(wèn)題,事務(wù)的可重復(fù)讀的能力是怎么實(shí)現(xiàn)的?

    以上就是關(guān)于可重復(fù)使用怎么讀相關(guān)問(wèn)題的回答。希望能幫到你,如有更多相關(guān)問(wèn)題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會(huì)為您講解更多精彩的知識(shí)和內(nèi)容。


    推薦閱讀:

    可重復(fù)使用怎么讀(可重復(fù)使用的英語(yǔ)怎么寫)

    如何避免不可重復(fù)讀(如何避免不可重復(fù)讀英語(yǔ))

    抖音小店退了可重新開店嗎(抖音小店退了可重新開店嗎怎么弄)

    怎么采集搜索量高的關(guān)鍵詞(怎么收集關(guān)鍵詞)

    品牌設(shè)計(jì)的主要原則