mysql mmvc 搞懂mysql事物隔離級別

2021-10-18 09:37:36 字數 3388 閱讀 3415

事物是為交易而生

事物的英文單詞 transaction,就是交易的意思. 交易和事物是乙個東西.

mysql的事物的4種隔離級別

mysql的事物隔離級設計的一點也不高階

隔離級別只是乙個很燒腦的概念,並不是什麼高大上的技術.

ru,全稱read-uncommitted, 中文翻譯:讀未提交,能夠讀到未提交的資料,就是不隔離

rc,全稱read-committed,中文翻譯:讀已提交,能讀到已提交的資料.

rr,全稱repeatable-read,中文翻譯:可重複讀. 也有人管這個叫當前讀.

serializable,中文翻譯:序列化,序列執行.

從上到下越來越嚴格,效能也越來越差.

mysql預設的隔離級是哪種?

預設是第三種,rr可重複讀

隔離性是什麼?

隔離性是當多個使用者併發訪問資料庫時,比如操作同一張表時,資料庫為每乙個使用者開啟的事務,不能被其他事務的操作所干擾,多個併發事務之間要相互隔離。

即要達到這麼一種效果:對於任意兩個併發的事務t1和t2,在事務t1看來,t2要麼在t1開始之前就已經結束,要麼在t1結束之後才開始,這樣每個事務都感覺不到有其他事務在併發地執行。

隔離的了什麼?

隔離的是事物中間狀態產生的資料.

什麼是中間狀態?

乙個事物中包含了多個sql,

還沒有全部執行完成,只完成了一部分sql,還沒有提交,這就是中間狀態的資料.

隔離的就是這時候的資料.

這個時間雖然很短暫,但是程式併發執行的時候會出現,乙個事物還未執行完,另乙個事物就開始執行了,開始查資料了.

第二個事物是否可以看見第乙個事物中已經修改了,但是還未提交的資料呢?這就是隔離級別考慮的問題.

選擇哪個隔離級別呢

第一種 ru 完全不隔離, 會出現髒讀,基本不用.

第四種完全實現了acid,解決髒讀、不可重複讀、幻讀,可保證事務安全,但完全序列執行,效能最低

,由於效能太差,網際網路應用併發大,一般不用.

然後剩下rr,rc. 都避免了髒讀,事物更新資料後,還未提交時,對其他事物是不可見的.它們讀到的是更新之前的資料.

rc 解決髒讀的問題,存在不可重複讀、幻讀的問題

rr是mysql 預設級別,解決髒讀、不可重複讀的問題,存在幻讀的問題。使用 mmvc機制 實現可重複讀

rc,rr的區別是什麼?

能不能可重複讀.

可重複讀和不可重複讀有什麼區別?

乙個事物在執行過程中,能不能讀到其他事物已經提交的事物對資料的更新呢?

如果能讀到資料的變化,就是不可重複讀,

如果不能讀到資料的變化,就是可重複讀.

不可重複讀是什麼情況?

在同乙個事務內兩次讀取同一條資料,讀到的結果可能會不一樣,這就是「不可重複讀」。

可重複讀的情況是什麼?

本次事物開啟後, 其他事物對資料的修改 我也不管,就當看不見, 即使其他事物已經修改了資料,我再查詢的時候,還是得到老資料.

這個隔離級別更高.

說的是本次事物可重複讀.不受其他事物影響.

那麼rc,rr選哪個?

其實選哪個都行,

有乙個兼顧兩種隔離級別的方案.

就是樂觀鎖, 資料表增加版本號字段,

先查資料,更新的時候限定更新where的條件帶上查詢到的版本號.

執行結果判斷一下影響的結果行數要等於1才是更新成功.

因為即使where條件沒有符合的資料,也不會返回失敗.而是影響的結果為0.

就能防止在這個時候,其他事物突然更新了資料造成資料異常.

這樣就控制了併發更新.

併發事物會出現哪些問題?

在事務的併發操作中可能會出現髒讀,不可重複讀,幻讀。

什麼是幻讀?什麼情況出現?

幻讀會在 ru / rc / rr 級別下出現,serializable 則杜絕了幻讀,

幻讀,並不是說兩次讀取獲取的結果集不同,幻讀側重的方面是某一次的 select 操作得到的結果所表徵的資料狀態無法支撐後續的業務操作。更為具體一些:select 某記錄是否存在,不存在,準備插入此記錄,但執行 insert 時發現此記錄已存在,無法插入,此時就發生了幻讀。

鎖 與 隔離級別

某個隔離級別預設帶了某些鎖,但是可以單獨加鎖.

update語句是會更新已提交的事物的資料.也就是對當前最新資料進行更新

update語句是自帶for update的.

serializable 隔離級別下會隱式為你加行x鎖

x是根據你的查詢條件計算的行的範圍

間隙鎖是行鎖的公升級版,間隙鎖比行鎖範圍大一點.

加鎖的目的是防止當前事物被其他事物干擾.

也就是說,即使把所有的記錄都加上鎖,還是阻止不了新插入的記錄,這也是為什麼「幻讀」會被單獨拿出來解決的原因。

for update的bug

查詢語句加上for update 會查詢到當前資料庫最新的資料, 其他事物已經提交的資料都能看到.

所以for update的查詢也叫 當前讀.

解決幻讀

為了解決幻讀問題,innodb引入了間隙鎖(gap lock).顧名思義,就是鎖住兩個值之間的空隙.

間隙鎖容易導致死鎖.

間隙鎖在可重複讀隔離級別下才有效

next-key lock 實際上是由間隙鎖加行鎖實現的。

當使用唯一索引來搜尋唯一行的語句時,不需要間隙鎖定。只使用行鎖.

否則會使用間隙鎖

如果,搜尋條件裡有多個查詢條件(即使每個列都有唯一索引),也是會有間隙鎖的。

幻讀還是很難解決的,

可以用樂觀鎖解決.

mvvc

相當於乙個快照

mvcc(multi version concurrency control的簡稱),代表多版本併發控制。與mvcc相對的,是基於鎖的併發控制,lock-based concurrency control)。

mvcc最大的優勢:讀不加鎖,讀寫不衝突。在讀多寫少的oltp應用中,讀寫不衝突是非常重要的,極大的增加了系統的併發效能

原理:一致性檢視, innodb 在實現 mvcc 時用到的一致性讀檢視,即 consistent read view,用於支援 rc(read committed,讀提交)和 rr(repeatable read,可重複讀)隔離級別的實現。

這個檢視不是那個我們可以自己建立的檢視,是兩個概念.

資料表中的一行記錄,其實可能有多個版本 (row),每個版本有自己的 row trx_id 作為版本號 來區分.

mysql裡面很多概念理解起來很燒腦.都是為了解決一些問題造出了一堆概念,解決乙個老問題就會產生乙個新問題,如此迴圈無窮盡也.

搞懂線段樹

前段時間寫了篇 搞懂樹狀陣列 如果說樹狀陣列是優雅的,那麼線段樹就是萬能的。有句話就叫 樹狀陣列能做的線段樹都能做,但是樹狀陣列能做的堅決用樹狀陣列!因為線段樹本來的內容狠豐富的,主要有單點跟新 區間跟新,最值詢問 區間詢問 反正就是對於區間進行的動態跟新詢問都能較高效的完成。對於初學者,一定要明白...

徹底搞懂px em rem

px畫素 pixel 相對長度單位。畫素px是相對於顯示器螢幕解析度而言的。px特點 em是相對長度單位。相對於當前物件內文字的字型尺寸。如當前對行內文字的字型尺寸未被人為設定,則相對於瀏覽器的預設字型尺寸。em特點 注意 任意瀏覽器的預設字型高都是16px。所有未經調整的瀏覽器都符合 1em 16...

搞懂Vue插槽

vue插槽,是學習vue中必不可少的一節,當初剛接觸vue的時候,對這些掌握的一知半解,特別是作用域插槽一直沒明白。後面越來越發現插槽的好用。下面來總結一下插槽的一些知識吧。分一下幾點 1 插槽內可以放置什麼內容?2 預設插槽 3 具名插槽 4 作用域插槽 一 插槽內容一句話 插槽內可以是任意內容。...