一文讀懂mysql的四種事務隔離級別

2021-10-05 23:33:28 字數 1632 閱讀 3867

目錄前言

read uncommitted 未提交讀

read comitted 提交讀

repeatable read 可重複讀

serializable 可序列化

總結:理解mysql的四種事務隔離級別的前提,需要理解什麼是事務。不知道的請移步,先理解什麼是事務:什麼是事務。

mysql的四種事務隔離級別,描述的是事務與事務之間的相互影響與否,以及會怎樣影響的關係。

我們首先舉個例子,以便後面容易理解。現在我們有兩個事務,每個事務呢又做了幾件事情。

髒讀是指乙個事務在處理資料的過程中,讀取到另乙個未提交事務的資料。

例子1:

比如學生表中張三的作業完成進度最初為60%。事務a中要做的事情1就是去讀取學生表中張三的作業完成進度,但是事務b發生在前,事務b事情4修改了進度為70%。事情的詭異就在這裡了,此時事務b雖然未提交,但是事務a任然會讀取到進度為70%。對我們的程式影響在於,如果事務b不提交了,回滾了,那麼明顯的事務a中讀取的資料就是錯誤的。這種現象我們稱之為髒讀(dirty read)

提交讀(不可重複讀)是指對於資料庫中的某個資料,乙個事務範圍內的多次查詢卻返回了不同的結果,這是由於在查詢過程中,資料被另外乙個事務修改並提交了。

例子2:

比如學生表中張三的作業完成進度最初為60%。事務a事情1讀取到的進度為60%,然後馬上事務b把進度修改為70%,並提交了。雖然事情1事情2在同乙個事務中,但是事情2再次讀取到的進度為70%,兩個結果並不一致,我們稱之為不可重複讀問題。提交讀雖然在這種情況下不一致,但是解決了例子1中髒讀問題。

可重複讀存在的問題就是,其他事務如果新增行,那麼當前事務會把此行讀取到。當然可重複讀解決了髒讀和不可重複讀問題。

例子3:

事務a 中事情1要做的是讀取年齡大於18且小於20歲的所有學生資訊,這時,讀取的結果只有張三李四兩個人。此時事務b新增了乙個學生,這個學生正好19歲,叫王五,並提交了事務b。這時,事務a中事情2又做了同樣的事情,讀取年齡大於18且小於20歲的所有學生資訊,但是問題出來了,此時讀取結果是張三李四王五三個人。這個問題我們稱之為幻讀。

mysql預設為可重複讀。

這種級別就是最高了,解決了髒讀,不可重複讀,幻讀問題。

需要注意的一點的是,不是說我們都使用可序列化就可以了,因為它最嚴謹嘛。事實並不是這樣,越嚴謹開銷越大,能支援的併發越小。

隔離級別

髒讀不可重複讀

幻讀read uncommited✔✔

✔read commitedx✔

✔repeatable readxx

✔serializablexx

x

一文讀懂Mysql的鎖機制

懂的越多,不懂的越多 今天只說mysql本身的鎖機制和innodb的鎖,有不對的地方,歡迎指正。mysql自帶的鎖機制 全域性鎖,表級鎖 而行級鎖由引擎來實現,但是要記住不是所有引擎都對行級鎖有支援,比如myisam就不支援行級鎖,所以基本沒有太多的應用場景了。全域性鎖 主要是用來進行全庫邏輯備份使...

一文讀懂mysql索引底層原理

mysql官方對索引的定義為 索引是幫助mysql高效獲取資料的資料結構,簡單來說 索引就是資料結構.資料庫的底層索引是用b樹和b 樹實現的,但是為什麼使用的是它們,為什麼不用紅黑樹?紅黑樹等資料結構也可以用來實現索引,但是檔案系統以及資料庫系統普遍採用b tree b tree作為索引結構.這是因...

MySQL的四種事務隔離

sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的併發處理,並擁有更低的系統開銷。read uncommitted 讀取未提交內容 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,因...