數據庫事務的四種隔離級別

數據庫定義了四種隔離級別:mysql

  • Read Uncommitted(未提交讀)
  • Read Committed(提交讀)
  • Repeatable Read(重複讀)
  • Serializable(串行化)

這四種隔離依次升高,隔離級別越低,系統開銷越小,併發支持性更高。sql

使用命令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的插入行爲。

注意不要混淆不可重複讀和幻讀code

Read Uncommited

  • 在RU模式下,即便事務沒有commit,在其餘事務中仍能夠讀到未提交的數據。
  • RU是全部隔離級別中最低的一種。RU模式會致使髒讀

Read Commited

  • RC模式下,事務只能讀取到已經commit的數據。
  • 好比事務a在執行時,若是事務b沒有提交,a是讀不到b的數據的。若是b提交a便能讀到b修改的數據。
  • RC能夠避免髒讀,可是會致使不可重複讀。
  • 大部分系統使用的是RC模式

Repeatable

  • RR模式下,事務的屢次Read不會受其餘事務的影響(不管提交與否)
  • 能夠理解爲RR模式下事務a在建立的時候獲取了一次當前時刻數據的快照,快照不受其他事務的影響。
  • RR模式可能會致使幻讀,由於沒法感知其他事務,可能致使重複的插入。
  • mysql innoDB的RR模式能夠必定程度避免幻讀,該特性是經過間隙鎖(gap lock)來實現的,間隙鎖的原理能夠參照這篇文章http://www.jianshu.com/p/bf86...

Serializable

  • 串行化,顧名思義,是將全部讀寫操做徹底串行。
  • 串行化是全部隔離級別中最高的
  • 每次讀都須要得到表級共享鎖,讀寫相互都會阻塞
  • 串行化對資源的開銷大,對併發支持很差,只在,某些場景下使用。

最後給出四個隔離級別對三種讀類型的對照表:事務

隔離級別 髒讀 不可重複讀 幻讀
Read Uncommited 可能 可能 可能
Read Commited 不可能 可能 可能
Repeatable Read 不可能 不可能 可能
Serializable 不可能 不可能 不可能
相關文章
相關標籤/搜索