摘要:使用命令可以查看當前數據庫使用的隔離級別在介紹四種隔離級別前先說明三種在使用事務時會出現的特殊大部分情況會導致錯誤讀類型。是所有隔離級別中最低的一種。
數據庫定義了四種隔離級別:
Read Uncommitted(未提交讀)
Read Committed(提交讀)
Repeatable Read(重復讀)
Serializable(串行化)
這四種隔離依次升高,隔離級別越低,系統開銷越小,并發支持性更高。
使用命令show variables like "%isolation%";可以查看當前數據庫使用的隔離級別
在介紹四種隔離級別前先說明三種在使用事務時會出現的特殊(大部分情況會導致錯誤)讀類型。
臟讀
臟讀是指一個事務a修改或添加了一條數據,在a事務提交之前,另一個事務b讀到了這條數據,并進行了操作。a如果回滾的話,臟讀可能會導致b操作不存在的數據。
不可重復讀
在一次事務中的兩次相同條件的查詢不一致,比如a事務執行select count(*) from user where name="alex" 這時事務b插入了一條數據name=alex并提交這就會導致事務a第二次查詢的時候多了一個計數
幻讀
幻讀與不可重復讀相反,事務a與事務b是完全隔離的,事務a執行"select id from user得到的id為1和2.這個時候b事務在user表中添加了一條數據id=3并提交,然后事務a想添加一條id為3的數據,如果id是唯一的,那a就會發現插不進去并提示dumplicate entry 3 for key id,原因是事務a阻止事務b的插入行為。
注意不要混淆不可重復讀和幻讀
Read Uncommited在RU模式下,即使事務沒有commit,在其他事務中仍可以讀到未提交的數據。
RU是所有隔離級別中最低的一種。RU模式會導致臟讀
Read CommitedRC模式下,事務只能讀取到已經commit的數據。
比如事務a在執行時,如果事務b沒有提交,a是讀不到b的數據的。如果b提交a便能讀到b修改的數據。
RC可以避免臟讀,但是會導致不可重復讀。
大部分系統使用的是RC模式
RepeatableRR模式下,事務的多次Read不會受其他事務的影響(無論提交與否)
可以理解為RR模式下事務a在創建的時候獲取了一次當前時刻數據的快照,快照不受其余事務的影響。
RR模式可能會導致幻讀,因為無法感知其余事務,可能導致重復的插入。
mysql innoDB的RR模式可以一定程度避免幻讀,該特性是通過間隙鎖(gap lock)來實現的,間隙鎖的原理可以參照這篇文章http://www.jianshu.com/p/bf86...
Serializable串行化,顧名思義,是將所有讀寫操作完全串行。
串行化是所有隔離級別中最高的
每次讀都需要獲得表級共享鎖,讀寫相互都會阻塞
串行化對資源的開銷大,對并發支持不好,只在,某些場景下使用。
最后給出四個隔離級別對三種讀類型的對照表:
隔離級別 | 臟讀 | 不可重復讀 | 幻讀 |
---|---|---|---|
Read Uncommited | 可能 | 可能 | 可能 |
Read Commited | 不可能 | 可能 | 可能 |
Repeatable Read | 不可能 | 不可能 | 可能 |
Serializable | 不可能 | 不可能 | 不可能 |
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/17650.html
閱讀 2142·2023-04-26 00:00
閱讀 3239·2021-09-24 10:37
閱讀 3528·2021-09-07 09:58
閱讀 1517·2019-08-30 15:56
閱讀 2217·2019-08-30 13:11
閱讀 2311·2019-08-29 16:38
閱讀 959·2019-08-29 12:58
閱讀 1876·2019-08-27 10:54