1. 程式人生 > 實用技巧 >分散式事務01 事務基本概念

分散式事務01 事務基本概念

分散式事務01 事務基本概念

事務的定義

一組SQL組成的執行單元,該單元要保證整體成功整體失敗

本地事務

本地事務出現在關係型資料庫中,僅支援單庫事務,不可跨庫

分散式事務

同一個事務,在操作多個數據庫的時候需要保持ACID的特性,通常用於微服務場景下的多服務處理

  • 情景:訂單、積分、物流等等服務共同操作資料庫

事務特性

ACID

A 原子(Atomicity)

  • 事務是不可分割的工作單位
  • 要麼都成功,要麼都失敗

C 一致(Consistemcy)

  • 事務前後狀態一致

I 隔離(Isolation)

  • 事務可以有多個元自曝的形式併發執行,但是互不干擾

D 持久(Durability)

  • 事務執行後,持久化到磁碟,不丟失

事務隔離級別

常見四隔離級別

  • 未提交(Read Uncommitted)

    以操作同一行資料為前提,讀事務允許其他讀事務和寫事務,未提交的寫事務禁止其他寫事務(但允許其他讀事務)。

    • 優點:防止更新丟失
    • 缺點:不能防止髒讀、不可重複讀、幻讀
    • 實現:排他寫鎖
  • 讀提交(Read Committed)

    Oracle預設的隔離級別
    以操作同一行資料為前提,讀事務允許其他讀事務和寫事務,未提交的寫事務禁止其他讀事務和寫事務。

    • 優點:防止更新丟失、髒讀

    • 缺點:不能防止不可重複讀、幻讀

    • 實現:

      • 瞬間共享讀鎖
      • 排他寫鎖
  • 可重複讀取(Repeatable Read)

    MySQL預設的隔離級別
    以操作同一行資料為前提,讀事務禁止其他寫事務(但允許其他讀事務),未提交的寫事務禁止其他讀事務和寫事務。

    • 優點:防止更新丟失、髒讀、不可重複讀

    • 缺點:不能防止幻讀

    • 實現

      • 排他寫鎖
      • 共享讀鎖
  • 序列化(Serializable)

    • 優點:防止更新丟失、髒讀、不可重複讀、幻讀
    • 缺點:併發效能最弱
    • 實現:必須通過其他機制保證新插入的資料不會被剛執行查詢操作的事務訪問到。

隔離級別的問題

  • 髒讀:讀出了未提交的資料
    -情景:
    1. A轉給B 100 B提交
    2. C讀取B,A網路波動回滾
    3. AB因為原子性,C讀出髒資料

  • 不可重複讀:多次查詢,返回不同資料值

    。(查詢間隔被另外事務修改)

    • 情景:
      1. AB搶同一張火車票
      2. A猶豫了未支付,B下單了
      3. 現在A去看車票,沒有了
    • 解決:select for update
  • 幻讀:

    • 情景:A讀取某範圍內記錄時,B提交事務,A再次讀,A讀到了第一次未讀到的資料
  • 區別:

    • 髒讀VS不可重複讀:髒讀讀到的是前一個事務未提交的,不可讀到的是前一個事務已經提交的
    • 不可重複讀VS幻讀:都是讀到另一個事務已經提交的資料(髒讀是讀到未提交);不可重複讀是讀同一個數據值(同一條資料),幻讀是針對一批整體的資料(資料的總數或一張表)

值得反思的面經

答案見上文

  • 說說你對事務的理解?
  • 說說事務的特性?
  • 說說併發實物不隔離,會有什麼問題?