mysql寫乙個事物 搞懂mysql事物隔離級別

2021-10-19 19:11:08 字數 3267 閱讀 8897

事物是為交易而生

事物的英文單詞 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裡面很多概念理解起來很燒腦.都是為了解決一些問題造出了一堆概念,解決乙個老問題就會產生乙個新問題,如此迴圈無窮盡也.

Spring在乙個事物中開啟另乙個事物並提交

自己平時的一點筆記 在對資料庫資料進行修改操作時,當 現異常時,那麼事物就會進行回滾操作,資料庫內的資料將不會被修改 但總是會有一些需要就是即使 中途報錯了,也要將資料庫中的資料進行修改,這時,就需要重新開啟乙個事物去提交 方法一 運用註解 transactional propagation pro...

python寫乙個服務 Python寫乙個服務

coding utf 8 import json from urllib.parse import parse qs from wsgiref.server import make server 定義函式,引數是函式的兩個引數,都是python本身定義的,預設就行了。定義檔案請求的型別和當前請求成功...

寫乙個東東

最近打了幾天的三國無雙6,感覺不錯!很久很久以前,乙個小學同學帶了我到機室玩三國無雙。自此,我便喜歡上了這個遊戲。現在我玩的遊戲內有兩個 三國無雙和cs。ps 曾經有些怪我的這個好朋友帶我打遊戲,但現在想來,若不是他,我的童年又怎麼會有歡樂呢。人活著,快樂是最重要的.因為以前是用專用手柄打的,感覺非...