轉載出處: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(可重復讀)。
