-
當前位置:首頁 > 創(chuàng)意學院 > 技術 > 專題列表 > 正文
可重復使用怎么讀(可重復使用的英語怎么寫)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關于可重復使用怎么讀的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等
只需要輸入關鍵詞,就能返回你想要的內容,越精準,寫出的就越詳細,有微信小程序端、在線網(wǎng)頁版、PC客戶端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內優(yōu)秀的企業(yè),服務客戶遍布全球各地,如需了解SEO相關業(yè)務請撥打電話175-8598-2043,或添加微信:1454722008
本文目錄:
一、mysql 解決可提交讀、可重復讀、幻讀
這張圖本人覺得總結得挺好的,在一般的互聯(lián)網(wǎng)項目中,基本上用的都是Innodb引擎,一般只涉及到的都是行級鎖,但是如果sql語句中不帶索引進行操作,可能會導致鎖表,這是不推薦的,性能非常低,可能會導致全表掃描等,行鎖的具體實現(xiàn)算法有以下幾種mysql特有的鎖:
Record Lock(記錄鎖):單個行記錄的鎖,一般是唯一索引或者主鍵上的加鎖
Gap Lock(間隙鎖):鎖定一個區(qū)間,但是不包括自身,開區(qū)間的鎖,RR級別才會有間隙鎖,間隙鎖的唯一目的是防止區(qū)間數(shù)據(jù)的插入,所以間隙鎖與間隙鎖之間是不會相互阻塞的
Next-key Lock(臨鍵鎖):與間隙鎖的區(qū)別是包括自身,是左開右閉區(qū)間,RR級別才會有
加鎖規(guī)則里面,包含了兩個“原則”、兩個“優(yōu)化”和一個“bug”。
原則 1:加鎖的基本單位是 next-key lock,希望你還記得,next-key lock 是前開后閉區(qū)間。
原則 2:查找過程中訪問到的對象才會加鎖。
優(yōu)化 1:索引上的等值查詢,給唯一索引加鎖的時候,next-key lock 退化為行鎖。
優(yōu)化 2:索引上的等值查詢,向右遍歷時且最后一個值不滿足等值條件的時候,next-key lock 退化為間隙鎖。
一個 bug:唯一索引上的范圍查詢會訪問到不滿足條件的第一個值為止。
舉例來說明上述的原則:
建表
插入數(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:鎖表
因為d字段上沒有建索引,所以涉及該字段的查詢加鎖會鎖住整個表
因為d字段上面沒有建立索引,所以事務1執(zhí)行后會導致整個表被鎖,后面所有的操作都會在等待整個表鎖被釋放
例子2:主鍵/唯一索引 記錄鎖
id字段為主鍵,而且事務1查詢命中了唯一的記錄,默認是加Next-key Lock,區(qū)間是(0,5],但是根據(jù)優(yōu)化1,唯一索引/主鍵上的等值查詢,會退化為行鎖,所以只會鎖5這個記錄。
例子3:主鍵/唯一索引上的間隙鎖
由于表 t 中沒有 id=7 的記錄,所以用我們上面提到的加鎖規(guī)則判斷一下的話:根據(jù)原則 1,加鎖單位是 next-key lock,事務1加鎖范圍就是 (5,10];同時根據(jù)優(yōu)化 2,這是一個等值查詢 (id=7),而 id=10 不滿足查詢條件,next-key lock 退化成間隙鎖,因此最終加鎖的范圍是 (5,10),所以事務2會阻塞,事務3執(zhí)行成功。
例子4:普通索引上的間隙鎖
c字段是普通索引,事務1執(zhí)行時默認是對區(qū)間(0,5]加間隙鎖,根據(jù)優(yōu)化2,非唯一索引/主鍵會繼續(xù)向右遍歷,找到10,所以最終的加鎖為(0,5]的Next-Key鎖+(5,10)的間隙鎖,所以事務2阻塞,事務3成功。
例子5:間隙鎖與行鎖
事務1默認的Next-Key鎖區(qū)間是(0,5],根據(jù)優(yōu)化2會向右遍歷,找到不滿足查詢條件的10,退化成間隙鎖,所以事務1的鎖是(0,5]的Next-Key鎖+(5,10)的間隙鎖,這兩個鎖與行鎖是沖突的,而事務2申請的Next-Key鎖是和事務1一樣,但是c=5的行鎖與事務1沖突,所以產生了阻塞,如果改為update t set d=1000 where c=6;因為此時產生的間隙鎖為(5,10),而間隙鎖與間隙鎖是不沖突的,不會產生阻塞
例子6:lock in share mode鎖覆蓋索引
事務1存在覆蓋索引的情況,不會去回表,lock in share mode這種情況下只會鎖c字段索引,而事務2是對主鍵加行鎖,所以兩者不存在沖突。
例子7:主鍵/唯一索引上的范圍查詢
開始執(zhí)行的時候,要找到第一個 id=10 的行,因此本該是 Next-Key Lock(5,10],根據(jù)優(yōu)化 1, 主鍵 id 上的等值條件,退化成行鎖,只加了 id=10 這一行的行鎖。范圍查找就往后繼續(xù)找,找到 id=15 這一行停下來,因此需要加 Next-Key Lock(10,15],所以事務3是沖突的。
例子8:普通索引上的范圍查詢
開始執(zhí)行時,找到第一個滿足條件的行10,加鎖Next-Key Lock(5,10],因為不是唯一索引,所以不會退化,繼續(xù)向后面找,找到15這一行停下來,因此需要加 Next-Key Lock(10,15],因為是范圍查詢,所以鎖不會退化。
快照讀: 通過MVCC實現(xiàn),該技術不僅可以保證innodb的可重復讀,而且可以防止幻讀,但是他讀取的數(shù)據(jù)雖然是一致的,但是數(shù)據(jù)是歷史數(shù)據(jù)。
簡單的select操作(不包括 select … lock in share mode, select … for update)
當前讀: 要做到保證數(shù)據(jù)是一致的,同時讀取的數(shù)據(jù)是最新的數(shù)據(jù),innodb提供了next-key lock,即gap鎖與行鎖結合來實現(xiàn)。
select … lock in share mode
select … for update
insert
update
delete
自己理解:
簡單的select是快照讀,快照讀實現(xiàn)可提交讀,可重復讀和幻讀是通過MVCC+ReadView實現(xiàn)的,而當前讀實現(xiàn)這幾種是通過鎖來實現(xiàn)的,為了說明具體原理,下面介紹下MVCC和ReadView概念,所以簡單的select是通過樂觀鎖實現(xiàn)的,當前讀是通過悲觀鎖實現(xiàn)的。
參考文章:
https://www.sohu.com/a/302045871_411876
https://www.jianshu.com/p/d1aba64b5c03
https://www.jianshu.com/p/32904ee07e56
二、蒸汽眼罩可以重復使用嗎?循環(huán)使用的效果怎么樣?
蒸汽眼罩一般分為一次性、插電式和加熱式三種。很多人都很困惑,蒸汽眼罩可以重復使用嗎?蒸汽眼罩可以回收嗎?
蒸汽眼罩可以重復使用嗎?
有兩種類型的蒸汽眼罩,一次性和可重復使用。可以根據(jù)自己的需求購買。蒸汽眼罩一般設計成片狀,眼睛幾乎看不到的微小溫熱蒸汽軟化皮膚,緩解疲勞。舒適快速——接駁溫度40℃左右,持續(xù)5-10分鐘,會讓你身心舒暢。一次性,方便,衛(wèi)生,快捷。攜帶方便,隨時隨地都可以使用。比如睡前、閑暇時、課間休息時、午休時、坐飛機、火車時、辦公室休息時等。
蒸汽眼罩可以回收嗎?
一次性蒸汽眼罩不能回收。蒸汽眼罩和普通眼罩不一樣,一是一次性,重復使用不衛(wèi)生,二是不能產生溫度,沒用。蒸汽眼罩一般分為一次性、插裝版和微波加熱版三種。
眼睛頭暈不舒服很累怎么辦?
1.調節(jié)光線:在弱光下閱讀不會傷害眼睛,但如果光線不能提供足夠的明暗對比,就會使眼睛容易疲勞。你應該使用能提供明暗對比的柔和光線,不要使用直接將光線反射到人眼睛的電燈。
2.適時休息:如果連續(xù)在電腦前工作6-8小時,每隔2-3小時休息一次。喝杯咖啡,上個廁所,或者只是把視線從電腦上移開10-15分鐘。
3.調節(jié)電腦屏幕的亮度:電腦屏幕上的字體和數(shù)字就像小燈泡一樣,直接把光線射入你的眼睛。所以你需要調低屏幕亮度,調整明暗對比,讓字體清晰。
4.讓眼睛好好休息:緩解眼睛疲勞最好的方法就是讓眼睛休息,比你想象的簡單。打電話的時候可以閉著眼睛。如果你不需要讀或寫什么,那么你可以閉上眼睛,一邊聊天一邊休息。
5.練習瑜伽:瑜伽不僅是一種洞察靈魂的方式,也是恢復視力的好方法。
6.用茶敷眼睛:將毛巾浸泡在小米草茶中,平躺,將這條溫熱的毛巾敷在眼睛上10-15分鐘。這會使你的眼睛疲勞,但注意不要讓茶水流到眼睛里。同時讓小米草茶涼一會再用毛巾泡。
7.用手熱敷眼睛:搓手至熱。然后,閉上眼睛,用手掌遮住眼睛。不要壓眼睛,捂眼睛。慢慢呼吸,想象黑暗。每天這樣做20分鐘,有助于緩解眼睛疲勞。
8.經(jīng)常眨眼:眼瞼是你眼睛的私人按摩師。每天眨眼300次,有助于清潔眼睛,并給眼睛一點按摩。
三、可重復讀實現(xiàn)
事務指的就是一系列原子性的操作,這些操作要么全做,要么全都不做。事務是由引擎層支持的,而MylSAM不支持事務,InnoDB支持事務。
事務的隔離性是指事務之間互不干擾,相互隔離。Mysql有四種隔離級別,分別是未提交讀,提交讀,可重復讀和串行化。
在Mysql中,事務更新時,會記錄回滾操作。下圖就是將1改成2,2改成3,3改成4對應的回滾記錄。
同一條記錄存在不同版本,這就是MVVC,一個事務可以通過回滾操作得到該事務想要的版本
當系統(tǒng)中沒有比當前回滾更早的read-view時,回滾日志會被刪除,因此最好不要用長事務,因為會導致大量回滾日志無法刪除,占用大量空間。
set autocommit=1是顯示啟動事務的方式,啟動事務時用begin /start transaction,提交是commit,回滾用rollback。如果設置為set autocommit=0,那么執(zhí)行select時會創(chuàng)建事務,而且如果是長連接,事務沒有提交則不會自動提交,造成長事務。所以最好使用set autocommit =1。使用commit work and chain可以再下一次事務自動開啟。
四、mysql是如何實現(xiàn)可重復讀的?
一個事務要更新一行,如果剛好有另外一個事務擁有這一行的行鎖,會被鎖住,進入等待狀態(tài)。既然進入了等待狀態(tài),那么等到這個事務自己獲取到行鎖要更新數(shù)據(jù)的時候,它讀到的值又是什么呢?
可重復讀隔離級別下,事務在啟動的時候就“拍了個整個庫的快照”。如果一個庫有100G,那么我啟動一個事務,MySQL就要拷⻉100G的數(shù)據(jù)出來,這個過程得多慢啊。但是平時事務執(zhí)行起來卻是非常快的。不是全部拷貝出來那是怎么實現(xiàn)的呢?
InnoDB里面每個事務有一個唯一的事務ID,叫作transaction id。它是在事務開始的時候向InnoDB的事務系統(tǒng)申請的,是按申請順序嚴格遞增的。
而每行數(shù)據(jù)也都是有多個版本的。每次事務更新數(shù)據(jù)的時候,都會生成一個新的數(shù)據(jù)版本,并且把transaction id賦值給這個數(shù) 據(jù)版本的事務ID,記為row trx_id。同時,舊的數(shù)據(jù)版本要保留,并且在新的數(shù)據(jù)版本中,能夠有信息可以直接拿到它。
數(shù)據(jù)表中的一行記錄,其實可能有多個版本(row),每個版本有自己的row trx_id。
圖中虛線框里是同一行數(shù)據(jù)的4個版本,當前最新版本是V4,k的值是22,它是被transaction id 為25的事務更新的,因此它的row trx_id也是25。語句更新會生成undo log(回滾日志),圖中的三個虛線箭頭,就是undo log。
按照可重復讀的定義,一個事務啟動的時候,能夠看到所有已經(jīng)提交的事務結果。但是之后,這個事務執(zhí)行期間,其他事務的更新對它不可⻅。
一個事務只需要在啟動的時候聲明說,“以我啟動的時刻為準,如果一個數(shù)據(jù)版本是在我啟動之前生成的,就認;如果是我啟動以后才生成的,我就不認,我必須要找到它的上一個版本”。
如果“上一個版本”也不可⻅,那就得繼續(xù)往前找。如果是這個事務自己更新的數(shù)據(jù),它自己還是要認的。
在實現(xiàn)上, InnoDB為每個事務構造了一個數(shù)組,用來保存這個事務啟動瞬間,當前正在“活躍”的所有事務ID?!盎钴S”指的就 是,啟動了但還沒提交。數(shù)組里面事務ID的最小值記為低水位,當前系統(tǒng)里面已經(jīng)創(chuàng)建過的事務ID的最大值加1記為高水位。 這個視圖數(shù)組和高水位,就組成了當前事務的一致性視圖(read-view)。而數(shù)據(jù)版本的可⻅性規(guī)則,就是基于數(shù)據(jù)的row trx_id和這個一致性視圖的對比結果得到的。
InnoDB利用了“所有數(shù)據(jù)都有多個版本”的這個特性,實現(xiàn)了“秒級創(chuàng)建快照”的能力。
回到我們最開始的表格,看看最后執(zhí)行的結果是多少。做如下假設:
事務A的視圖數(shù)組就是[99,100], 事務B的視圖數(shù)組是[99,100,101], 事務C的視圖數(shù)組是[99,100,101,102]。為了簡化分析,我先把其他干擾語句去掉,只畫出跟事務A查詢邏輯有關的操作:
第一個有效更新是事務C,把數(shù)據(jù)從(1,1)改成了(1,2)。這時候,這個數(shù)據(jù)的最新版本的row trx_id是102,而90這個版本已經(jīng)成為了歷史版本。 第二個有效更新是事務B,把數(shù)據(jù)從(1,2)改成了(1,3)。這時候,這個數(shù)據(jù)的最新版本(即row trx_id)是101,而102又成為了歷史版本。
事務B的update語句,如果按照一致性讀,好像結果不對哦?
事務B的視圖數(shù)組是先生成的,之后事務C才提交,不是應該看不⻅(1,2)嗎,怎么能算出(1,3)來?
事務B在更新之前查詢一次數(shù)據(jù),這個查詢返回的k的值確實是1。 但是,當它要去更新數(shù)據(jù)的時候,就不能再在歷史版本上更新了,否則事務C的更新就丟失了。因此,事務B此時的set k=k+1是在(1,2)的基礎上進行的操作。 所以,這里就用到了這樣一條規(guī)則:更新數(shù)據(jù)都是先讀后寫的,而這個讀,只能讀當前的值,稱為 “當前讀” ( current read )。
在更新的時候,當前讀拿到的數(shù)據(jù)是(1,2),更新后生成了新版本的數(shù)據(jù)(1,3),這個新版本的row trx_id是101。
所以,在執(zhí)行事務B查詢語句的時候,一看自己的版本號是101,最新數(shù)據(jù)的版本號也是101,是自己的更新,可以直接使用, 所以查詢得到的k的值是3。
select語句如果加鎖,也是當前讀。
如果把事務A的查詢語句select * from t where id=1修改一下,加上lock in share mode 或 for update,也都可以讀到版本號是101的數(shù)據(jù),返回的k的值是3。下面這兩個select語句,就是分別加了讀鎖(S鎖,共享鎖)和寫鎖(X鎖,排他鎖)。
事務C’的不同是,更新后并沒有⻢上提交,在它提交前,事務B的更新語句先發(fā)起了。前面說過了,雖然事務C’還沒提交,但是(1,2)這個版本也已經(jīng)生成了,并且是當前的最新版本。那么,事務B的更新語句會怎么處理呢?
兩階段鎖協(xié)議,事務C’沒提交,也就是說(1,2)這個版本上的寫鎖還沒釋放。 而事務B是當前讀,必須要讀最新版本,而且必須加鎖,因此就被鎖住了,必須等到事務C’釋放這個鎖,才能繼續(xù)它的當前讀。
回到最初的問題,事務的可重復讀的能力是怎么實現(xiàn)的?
以上就是關于可重復使用怎么讀相關問題的回答。希望能幫到你,如有更多相關問題,您也可以聯(lián)系我們的客服進行咨詢,客服也會為您講解更多精彩的知識和內容。
推薦閱讀: