關於事務、事務的隔離級別以及對髒讀、不可重複讀、幻讀的理解

什麼是事務?

  事務,即數據庫事務。是數據庫管理系統執行過程當中的一個邏輯單位,由一個有限的數據庫操做序列構成數據庫

  一般,事務的正確執行會使數據庫從一種狀態轉換爲另外一種狀態併發

事務的特性(ACID原則)

  •  原子性(atomicity)       即不可分割性,事務要麼全執行、要麼全不執行。
  •  一致性(consistency)   事務的執行使得數據庫從一種正確狀態轉換成另一種正確狀態。
  •  隔離性(isolation)        在事務正確提交以前,不容許把事務對該數據的改變提供給任何其餘事務。
  •  持久性(durability)       事務正確提交以後,其結果將永遠保存在數據庫之中。

 

併發狀態下事務會產生的問題

  併發狀態解釋爲當事務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 而言就像是產生了幻覺。

 

事務的隔離級別

  爲了應對上面併發狀況下出現的問題,事務的隔離級別就產生了。當事務的隔離級別越高的時候,上面的問題就會越少,可是性能消耗也會越大。因此在實際生產過程當中,要根據需求去肯定隔離級別。

四種隔離級別

READ_UNCOMMITTED

  讀未提交,即可以讀取到沒有被提交的數據,因此很明顯這個級別的隔離機制沒法解決髒讀、不可重複讀、幻讀中的任何一種。

READ_COMMITED

  已提交,即可以讀到那些已經提交的數據,可以防止髒讀,可是沒法解決不可重複讀和幻讀的問題。

REPEATABLE_READ

  重複讀取,即在數據讀出來以後加鎖,相似"select * from XXX for update",明確數據讀取出來就是爲了更新用的,因此要加一把鎖,防止別人修改它。REPEATABLE_READ的意思也相似,讀取了一條數據,這個事務不結束,別的事務就不能夠改這條記錄,這樣就解決了髒讀、不可重複讀的問題,可是幻讀的問題仍是沒法解決。

SERLALIZABLE

  串行化,最高的事務隔離級別,無論多少事務,挨個運行完一個事務的全部子事務以後才能夠執行另一個事務裏面的全部子事務,這樣就解決了髒讀、不可重複讀和幻讀的問題了。

相關文章
相關標籤/搜索