MySQL中的事務隔離級別

事務的特性(ACID)

  • 原子性(Atomicity):一個事務必須被視爲一個不可分割的最小工做希望,整個事務中的全部操做要麼所有提交成功,要麼所有失敗回滾,對於一個事務來講,不可能只執行其中的一部分操做數據庫

  • 一致性(Consistency):數據庫老是從一個一致性的狀態轉換到另外一個一致性的狀態。併發

  • 隔離性(Isolation):一個事務所作的修改在最終提交之前,對其餘事務是不可見的。同一時間,只容許一個事務請求同一數據,不一樣的事務之間彼此沒有任何干擾。性能

  • 持久性(Durability):一旦事務提交,事務對數據庫的全部更新將被保存到數據庫,不能回滾。code

事務併發存在的問題

  • 髒讀:事務讀取了未提交的數據。如:事務A讀取了事務B更新的數據,而後事務B回滾了,那麼A讀取到的數據是髒數據。排序

  • 不可重複讀:在同一個事務中兩次執行一樣的查詢,獲得的結果不一致。如:事務 A 屢次讀取同一數據,事務 B 在事務A屢次讀取的過程當中,對數據做了更新並提交,致使事務A屢次讀取同一數據時,結果 不一致。事務

  • 幻讀:當某個事務在讀取某個範圍內的記錄時,另外一個事務又在該範圍內插入了新的記錄,當以前的事務再次讀取該範圍的記錄時,會產生幻行。InnoDB能夠經過多版本併發控制(MVCC)解決幻讀的問題。ci

事務隔離級別

  • READ UNCOMMITTED(未提交讀):一個事務中的修改操做即便沒有提交,對其餘事務也都是可見的。會出現髒讀的問題it

  • READ COMMITTED(提交讀):一個事務開始時,只能「看見」已經提交的事務所作的修改。解決了髒讀的問題,可是會存在不可重複讀的問題io

  • REPEATABLE READ(可重複讀):一個事務在屢次讀取一樣記錄時,結果是一致的。解決了髒讀不可重複讀的問題,可是沒法解決幻讀的問題table

  • SERIALIZABLE(可串行化):在讀取的每一行數據上都加鎖,經過強制事務串行執行的方式,避免了髒讀不可重複讀幻讀的問題,可是性能差

隔離級別 髒讀可能性 不可重複讀可能性 幻讀可能性 加鎖讀
讀未提交(read-uncommitted) Yes Yes Yes No
不可重複讀(read-committed) No Yes Yes No
可重複讀(repeatable-read) No No Yes No
可串行化(serializable) No No No Yes

總結

  • 事務的隔離級別從高到低的排序爲:可串行化 > 可重複讀 > 不可重複讀 > 讀未提交
  • 不可重複讀針對的是記錄的修改操做,幻讀針對的是記錄的插入操做
  • MySQL默認的事務隔離級別是REPEATABLE-READ,能夠經過show variables like 'transaction_isolation';命令查看
相關文章
相關標籤/搜索