iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0
自我挑戰組

Techschool Goalng Backend Master Class 的學習記錄系列 第 12

[Day 12] Understand isolation levels & read phenomena

  • 分享至 

  • xImage
  •  

Transaction isolation and read phenomena

ACID property

https://ithelp.ithome.com.tw/upload/images/20230927/20121746m4MCggsufG.png

當我們談論資料庫的ACID,我們是在描述一組保證資料庫交易正確和可靠的屬性。ACID代表原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持久性(Durability),這四大特性確保了資料庫交易的可靠性和資料的安全性:

  • 原子性(Atomicity)
    • 把整個交易視為一個原子,是一個不可分割的邏輯單位
      所以要嘛整個交易成功,不然就是整個交易失敗,沒有存在成功一半,因此只要其中一個操作沒有完全,那就會rollback回到原本的狀態。
    • 範例:想像你在ATM提款機提現。這包括兩步:扣除你的帳戶餘額,和出錢。原子性保證這兩步要麼一起完成,要麼一步都不完成。
  • 一致性(Consistency)
    • 交易前後保持一致性,資料庫從一個有效狀態經過交易之後變成另一個有效狀態:
      • 寫入資料庫的所有數據必須是有效的
      • 交易進行後 資料庫的完整性沒有被破壞
    • 範例:如果銀行帳戶不允許餘額低於0,則交易不應該使餘額低於這個數值。
  • 隔離性(Isolation)
    • Transaction過程中不會被其他Transaction影響
      他實際的效果會根據設定的isolation level 而有不同效果,但基本是要確保每個Transaction在進行時是互不干擾的
    • 範例:如果兩人同時從同一帳戶轉賬,每個人都看不到對方的交易,直到各自的交易完成。
  • 永久性(Durability)
    • 所有的數據都是由成功的Transaction交易寫入的,即使系統故障也不會丟失。
    • 範例:當你存錢後,即使銀行系統突然關機,你的存款資料也不會丟失。

Isolation

  • 在其最高水平上,完美的隔離性確保所有同時進行的交易不會互相影響。
  • 當多個交易同時運行時,一個交易可能會受到其他交易的干擾,這稱為read phenomenon

Read Phenomena

  • When a transaction is impacted by other transactions, it is called a "Read Phenomenon.”

  • It happens when there is low-level isolation.

  • There are several types of Read Phenomenon:

    Dirty Read

    當一個交易讀取了另一個未提交交易所修改的數據時,就會發生髒讀。這意味著,如果那個修改的交易最後回滾(即取消),那麼第一個交易讀取的數據就是不正確的。

    Non-Repeatable Read

    在一個交易的兩次讀取操作之間,另一個交易修改或刪除了該數據,導致第一個交易的兩次讀取結果不一致。

    Phantom Read

    在一個交易的兩次查詢操作之間,另一個交易插入或刪除了一些行,導致第一個交易的兩次查詢結果集不一致。

    Serialization Anomaly

    序列化異常是指當多個交易同時進行時,可能會發生的不符合期望的結果。這些結果在這些交易一個接一個、按順序執行時,也就是完全串行化時是不會發生的。

4 Isolation Levels

https://ithelp.ithome.com.tw/upload/images/20230927/20121746j7rrUo9cUJ.png

https://ithelp.ithome.com.tw/upload/images/20230927/20121746btp4KqvUD2.png

https://ithelp.ithome.com.tw/upload/images/20230927/20121746qhmbRuBd7F.png

ANSI其定義SQL不同的 Isolation 等級來標明哪個等級的 Isolation 可以解決上述問題:

  1. 讀未提交(Read Uncommitted)
    • 描述:這是最低的隔離級別。在此級別下,一個交易可以看到其他未提交交易的變更。
    • 結果:可能會出現Dirty Read
  2. 讀已提交(Read Committed)
    • 描述:在此級別下,一個交易只能看到已經提交的交易所做的變更。
    • 結果:解決了Dirty Read的問題,但仍可能出現Non-Repeatable Read
  3. 可重複讀(Repeatable Read)
    • 描述:這個級別確保在一個交易內多次讀取同一資料時,結果是相同的。其他交易在此期間不能修改這筆資料。
    • 結果:解決了Non-Repeatable Read的問題,但仍可能出現Phantom Read
  4. 串行化(Serializable)
    • 描述:這是最高的隔離級別。它確保所有交易都是串行化執行的,即彼此之間完全沒有干擾。
    • 結果:解決了所有上述的Serialization Anomaly,包括Phantom Read,但可能會影響性能,因為它通常需要更多的鎖。

上一篇
[Day 11] How to avoid deadlock in DB transaction?
下一篇
[Day 13] Understand isolation levels & read phenomena in MySQL
系列文
Techschool Goalng Backend Master Class 的學習記錄31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言