事務,即數據庫事務。是數據庫管理系統執行過程當中的一個邏輯單位,由一個有限的數據庫操做序列構成。數據庫
一般,事務的正確執行會使數據庫從一種狀態轉換爲另外一種狀態。併發
併發狀態解釋爲當事務A和事務B對同一資源進行操做時,可能會遇到不少的問題。性能
即事務A讀到了事務B尚未提交的數據。若是事務A對數據進行了更新,可是事務A並無提交,可是事務B這個時候看到了事務A沒有提交的更新。當事務A進行了回滾,那麼剛剛事務B看到的數據就是髒數據。也就是髒讀。atom
例子:事務
A 給 B 轉了100萬,可是 A 尚未提交,此時 B 查詢本身帳戶,多了100萬。而後 A 發現轉錯人了,回滾了事物。而後 B 100萬就沒了。在這個過程當中 B 查到了沒有提交的數據(多出的100萬),這就是髒讀。ci
即同一事務在事務執行過程當中對同一個數據進行了屢次讀取,可是每一次讀取的數據結果都不相同。緣由是在兩次讀取間隔,數據別其餘人修改了,致使了統一事務兩次讀取結果不一致。資源
例子:it
A 查詢銀行餘額爲100萬,B 這個時候取走了50萬,此時餘額變成了50萬,A 再一次查詢餘額,變成了50萬。對 A 而言兩次結果不一致就是不可重複讀。io
即在事務 A 屢次讀取數據集的過程當中中,事務 B 對數據進行了新增操做或者刪除操做,致使事務 A 屢次讀取的數據集不一致。date
例子:
A 修改當前公司全部職員信息的時候,B 向其中插入了一個新的職員,這個時候 A 提交的時候發現了一個本身沒有修改過的職員的信息,對 A 而言就像是產生了幻覺。
爲了應對上面併發狀況下出現的問題,事務的隔離級別就產生了。當事務的隔離級別越高的時候,上面的問題就會越少,可是性能消耗也會越大。因此在實際生產過程當中,要根據需求去肯定隔離級別。
讀未提交,即可以讀取到沒有被提交的數據,因此很明顯這個級別的隔離機制沒法解決髒讀、不可重複讀、幻讀中的任何一種。
已提交,即可以讀到那些已經提交的數據,可以防止髒讀,可是沒法解決不可重複讀和幻讀的問題。
重複讀取,即在數據讀出來以後加鎖,相似"select * from XXX for update",明確數據讀取出來就是爲了更新用的,因此要加一把鎖,防止別人修改它。REPEATABLE_READ的意思也相似,讀取了一條數據,這個事務不結束,別的事務就不能夠改這條記錄,這樣就解決了髒讀、不可重複讀的問題,可是幻讀的問題仍是沒法解決。
串行化,最高的事務隔離級別,無論多少事務,挨個運行完一個事務的全部子事務以後才能夠執行另一個事務裏面的全部子事務,這樣就解決了髒讀、不可重複讀和幻讀的問題了。