MySQL數據庫事務和隔離級別

數據庫事務和隔離級別
事務
數據庫事務是指作爲單個邏輯工作單元執行的一系列操作,要麼完全的執行,要麼完全的不執行。一方面,當多個應用程序併發訪問數據庫時,事務可以在應用程序間提供一個隔離方法,防止互相干擾。另一方面,事務爲數據庫提供了一個從失敗恢復正常的方法。
事務具有四個特性:

  1. 原子性(Atomicity)、
  2. 一致性(Consistency)、
  3. 隔離性(Isolation)、
  4. 持久性(Durability),
    簡稱ACID
    <1>原子性:
    是指事務中的操作不可拆分,只允許全部執行或者全部不執行
    <2>一致性:
    是指事務的執行不能破壞數據庫的一致性,一致性也稱完整性。一個事務在執行後,數據庫必須從一個一致性狀態轉變爲另一個一致性狀態。
    <3>隔離性:
    是指併發的事務相互隔離,不能互相干擾。
    <4>持久性:
    是指事務一旦提交,對數據庫的更改狀態將被永久的保存。

隔離級別:
數據庫的事務隔離級別有四個,由低到高分別是Read Uncommitted、Read committed、Repeatable read、Serializable,這四個級別可以逐個解決髒讀、不可重複讀、幻讀這幾類問題。

√: 可能出現 ×: 不會出現

髒讀 不可重複讀 幻讀
Readuncommitted
Read committed ×
Repeatable read × ×
Serializable × × ×

注意:我們討論事務隔離級別的場景,主要是在多個事務併發的情況下。

Read Uncommitted 讀未提交:
髒讀:一個事務讀到另一個事務未提交的更新數據
例:
公司發工資了,領導把5000元打到singo的賬號上,但是該事務並未提交,而singo正好去查看賬戶,發現工資已經到賬,是5000元整,非常高 興。可是不幸的是,領導發現發給singo的工資金額不對,是2000元,於是迅速回滾了事務,修改金額後,將事務提交,最後singo實際的工資只有 2000元,singo空歡喜一場。
當隔離級別設置爲Read uncommitted 時,就可能出現髒讀。

Read committed 讀提交:
不可重複讀:指在一個事務內多次讀取同一個數據。在這個事務還沒有結束時,另外一個事務也訪問同一個數據。在第一個事務多次讀取數據之間,另外一個事務對數據進行了修改,並提交了事務,那麼第一個事務在多次讀取數據時,發現數據不一致。
當數據庫級別爲Read committed的時候迴避免髒讀,但是會造成不可重複讀。
oracle默認隔離級別 Read committed。

Repeatable read 重複讀:
幻讀:事務A在執行讀取操作,第一次查詢數據總量後,事務B執行了一條新增的操作後並提交了事務,這時事務A再次讀取數據發現讀取到的數據和之前的不一樣了,就像產生幻覺一樣。
Repeatable read避免了不可重複讀,但是可能出現幻讀。
MYSQL默認隔離級別

Serializable 序列化:
Serializable 是最高的事務隔離級別,同時代價也花費最高,性能很低,一般很少使用,在該級別下,事務順序執行,不僅可以避免髒讀、不可重複讀,還避免了幻像讀。

如有總結不當,有問題,錯誤的地方請大家予以指正,共同學習,共同進步

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章