事務以及MySQL事務隔離級別+MySQL引擎的區別

  • 一、事務的基本要素:ACID
    • 一、原子性(Atomicity):
      • 事務開始後全部操做,要麼所有作完,要麼所有不作,不可能停滯在中間環節。事務執行過程當中出錯,會回滾到事務開始前的狀態,全部的操做就像沒有發生同樣。也就是說事務是一個不可分割的總體,就像化學中學過的原子,是物質構成的基本單位。
    • 二、一致性(Consistency):
      • 事務開始前和結束後,數據庫的完整性約束沒有被破壞 。好比 A 向 B 轉帳,不可能 A 扣了錢,B 卻沒收到。
    • 三、隔離性(Isolation):
      • 同一時間,只容許一個事務請求同一數據,不一樣的事務之間彼此沒有任何干擾。好比 A 正在從一張銀行卡中取錢,在 A 取錢的過程結束前,B 不能向這張卡轉帳。
    • 四、持久性(Durability):
      • 事務完成後,事務對數據庫的全部更新將被保存到數據庫,不能回滾。
  • 二、事務的併發問題
    • 髒讀:
      • 事務 T1 修改了 1 行數據,事務 T2 在事務 T1 提交以前讀到了該行數據
        注:即事務1修改數據,但未提交事務,事務2能夠看到。
    • 不可重複讀:
      • 事務 T1 讀取了一行數據,事務 T2 接着修改或者刪除了該行數據,當 T1 再次讀取同一行數據的時候,讀到的數據是修改以後的或者發現已經被刪除
        注:即事務1能夠讀到事務2修改前和修改提交後的數據。但事務2修改或刪除了數據。
    • 幻讀:
      • 事務 T1 讀取了知足某條件的一個數據集,事務 T2 插入了一行或者多行數據知足了 T1 的選擇條件,致使事務 T1 再次使用一樣的選擇條件讀取的時候,獲得了比第一次讀取更多的數據集。
        注:即事務1能夠讀到事務2修改前和修改提交後的數據。但事務2新增了數據。
    • 區別:以解決方式爲區分。
      • 髒讀:事務A讀取到另外一事務B提交以前的數據
        注:- 單次讀取,讀取到錯誤數據。
      • 不可重複讀:事務A屢次讀取同一數據,事務 B 在事務 A 屢次讀取的過程當中,對數據做了更新或者刪除,致使事務 A 屢次讀取同一數據時,結果 不一致。(鎖行解決)
        注:- 屢次讀取數據不一樣,側重於對某一行的操做
      • 幻讀:事務A讀取某一條件的數據,事務B插入了一行或多行。事務A先後讀取不一致。(鎖表解決)
        注:- 屢次讀取數據不一樣,側重於對整張表的操做
  • 三、MYSQL 事務的隔離級別
    • 圖示:
    • 事務說明:
      • 讀未提交(read-uncommitted)【會髒讀】【會不可重複讀】【會幻讀】
        注:即事務1修改數據,但未提交事務,事務2能夠看到。
      • 不可重複讀(也叫讀已提交)(read-committed)【會不可重複讀】【會幻讀】( oracle 默認)
        注:即事務1修改數據,但未提交事務,事務2不能夠看到。而後引起另外一個問題,事務1在事務2開始前和結束後讀取到的數據不一致(修改和刪除致使)。
      • 可重複讀(repeatable-read)【會幻讀】(mysql 默認)
        注:事務1在事務2開始前和結束後讀取到的數據不一致(新增致使)。
      • 串行化(serializable)【都不會】
    • 事務鎖說明:
      • 一、事務隔離級別爲讀提交時,寫數據只會鎖住相應的行。
      • 二、事務隔離級別爲可重複讀時:
        • 若是檢索條件有索引(包括主鍵索引)的時候,默認加鎖方式是 next-key 鎖;
        • 若是檢索條件沒有索引,更新數據時會鎖住整張表。一個間隙被事務加了鎖,其餘事務是不能在這個間隙插入記錄的,這樣能夠防止幻讀。
      • 三、事務隔離級別爲串行化時,讀寫數據都會鎖住整張表
      • 四、隔離級別越高,越能保證數據的完整性和一致性,可是對併發性能的影響也越大。
  • 四、Innodb 和 MyISAM 引擎之間的區別,以及應用場景
    • 區別
      • 一、MyISAM 是非事務安全的,而 InnoDB 是事務安全的
      • 二、MyISAM 鎖的粒度是表級的,而 InnoDB 支持行級鎖
      • 三、MyISAM 支持全文類型索引,而 InnoDB 不支持全文索引
      • 四、MyISAM 相對簡單,效率上要優於 InnoDB,小型應用能夠考慮使用 MyISAM
      • 五、MyISAM 表保存成文件形式,跨平臺使用更加方便
    • 應用場景:
      • 一、MyISAM 管理非事務表,提供高速存儲和檢索以及全文搜索能力,若是再應用中執行大量 select 操做,應該選擇 MyISAM
      • 二、InnoDB 用於事務處理,具備 ACID 事務支持等特性,若是在應用中執行大量 insert 和 update 操做,應該選擇 InnoDB
  • 五、參考:
相關文章
相關標籤/搜索