iT邦幫忙

2023 iThome 鐵人賽

DAY 15
0
自我挑戰組

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

[Day 15] Summary about relationship between isolation levels and read phenomena

  • 分享至 

  • xImage
  •  

MySQL

https://ithelp.ithome.com.tw/upload/images/20230930/20121746Z2Dmxgz1lk.png

Postgres

https://ithelp.ithome.com.tw/upload/images/20230930/20121746OMZR99Qb5X.png

Isolation Comparison between MySQL and Postgres

https://ithelp.ithome.com.tw/upload/images/20230930/20121746pzWq70l6dm.png

  • 首先,未提交讀取(read uncommitted)的隔離等級與已提交讀取(read committed)的行為相同。所以基本上,Postgres只有3個隔離等級,而不是MySQL中的4個。
  • 其次,Postgres不使用MySQL中的鎖定機制,而是使用了更好的依賴性檢測技術來停止不可重複的讀取、不一致的並發更新和序列化異常。
  • 另外,Postgres中的預設隔離等級只是已提交讀取,而在MySQL中則是可重複讀取。

Keep in mind

當使用高隔離等級時,您應該記住的最重要的事情是:

  • 可能會出現一些錯誤、超時或甚至死鎖。
  • 因此,我們應該仔細地為我們的交易實施重試機制。
  • 此外,每個數據庫引擎可能會有不同的隔離等級實現方式。
  • 所以確保您已經仔細閱讀了其文檔,並且在開始編碼之前先自己嘗試過。

Q&A:

  1. Non-Repeatable Read 和 Phantom Read 的差別?

    不可重複讀(Non-Repeatable Read)

    想像你有一個銀行帳戶,當前餘額是1000元。

    1. 交易A讀取你的銀行帳戶,看到餘額是1000元。
    2. 在交易A再次讀取之前,交易B進入並扣除了500元,然後提交了交易。
    3. 交易A再次讀取你的帳戶,這次看到的餘額是500元。

    這裡的問題是,交易A在同一個交易內兩次讀取同一筆資料,但結果不一致。這就是所謂的「不可重複讀」。

    幻讀(Phantom Read)

    假設你正在查詢銀行中所有餘額超過1000元的帳戶,並得到了5個結果。

    1. 交易A查詢所有餘額超過1000元的帳戶,找到了5個。
    2. 在交易A再次查詢之前,交易B新增了一個新帳戶,其餘額為1500元,然後提交了交易。
    3. 交易A再次查詢所有餘額超過1000元的帳戶,這次找到了6個。

    這裡的問題是,交易A在同一個交易內兩次進行相同的查詢,但結果集中的行數不一致。這就是所謂的「幻讀」。

    總結

    • 不可重複讀:涉及到同一筆資料的值在同一個交易中被其他交易更改。
    • 幻讀:涉及到新的資料行在同一個交易中被其他交易添加或刪除。

上一篇
[Day 14] Understand isolation levels & read phenomena in PostgreSQL
下一篇
[Day 16] Introduction Github Action
系列文
Techschool Goalng Backend Master Class 的學習記錄31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言