1. 程式人生 > 實用技巧 >事務的四種隔離級別圖解

事務的四種隔離級別圖解

轉載出處:https://zhuanlan.zhihu.com/p/102883333

4 種隔離級別

InnoDB 引擎中的事務隔離級別有 4 級,預設是"可重複讀"(Repeatable Read)。以下 4 個級別逐漸加強,每個級別都解決了上一個級別的問題,但也留下了新的問題。

髒讀(Read Uncommitted-讀未提交)

一個事務在處理過程中讀取了另外一個事務未提交的資料。

事務 1 更新資料後還未提交,事務 2 就讀到了該資料,所以叫 read uncommitted

讀提交(Read Committed)

讀取的資料是其它事務提交後的資料。

事務 1 更新了資料,但還未提交,這時事務 2 讀取到的資料是更新之前的。

在事務 1 提交後,事務 2 再讀取,此時讀取到的就是事務 1 更新後的資料。

這裡就有一個問題:::在同一事務過程中,多次讀取到的資料是不一致的::。所以又叫"不可重複讀"。

可重複讀(Repeatable Read)

在同一事務中,每次讀取的資料是一致的。

即使事務 1 提交了,事務 2 讀取的資料和事務 2 開始時間點的資料是一致的。

但這是也有一個問題:::如果事務 2 根據查詢出的結果進行更新,那麼會發現更新時的資料已經變成事務 1 更新後的資料了,而不是事務 2 查詢出的資料::。這就是"幻讀"。

序列化

各事務間互斥。即使是讀操作也會互斥。

mysql預設事務隔離級別是 Repeatable read;

以上四種隔離級別最高的是Serializable級別,最低的是Read uncommitted級別,當然級別越高,執行效率就越低,像Serializeble這樣的級別,就是以鎖表的方式(類似於Java多執行緒中的鎖)使得其他執行緒只能在鎖外等待,所以平時選用何種隔離級別應該根據實際情況來,在MYSQL資料庫中預設的隔離級別是Repeatable read(可重複讀)。