[Day1] 讀 RDBMS 課程 2019 - RDBMS 和 ACID

By Triton Ho

At Lesson 0: Page 1 - Page 27

Prerequisites

NoSQL 的 2pc

  • Two-Phase Commit
  • Prepare Phase and Commit Phase
  • 分佈式事務處理協議
  • 讓分佈式系統中的 nodes 可以在一致的狀態下進行 commit 或 rollback

Notes

為何選擇 RDBMS

  • 使用 RDBMS 比 noSQL 有更快的開發速度
  • 對一般中小型系統, RDBMS 效能足夠了
  • 使用 RDBMS 更加安全
  • RDBMS 支援十進制的 numeric (支援浮點數) ,在計算金錢數值時特別有用

ACID

Atomicity

  • RDBMS 所有運作都是以 Transaction (TX) 為單位
  • 一個 TX 可以自由包含多個 SQL 指令
  • 同一 TX 內的所有資料改動必須全部被順序執行,或是同一 TX 內所有資料改動都不被執行
  • 在當機時,所有還沒有 commited 的 TX 全被 Rollback
  • 當機後,需要修復資料時。 RDBMS 必須以 TX 為單位進行修復

Why atomicity is important?

  • 當機是不能避免的

  • 讓許多情境能簡單完成

    <!-- 用戶轉帳 --> START TRANSACTION; Update user_balance set balance = balance – amount where username = 'UserA'; Update user_balance set balance = balance + amount where username = 'UserB'; COMMIT;
  • 保證系統數據 consistent state 直接移到下一個 consistent state

Consistency

  • 不同人對 Consistency 定義不完全相同 (= =")
  • 系統的 Unique constraint 和 User-customized constraint 都必須滿足,否則,RDBMS 將會自動復原當前 TX 一切資料改動

Why consistency is important?

  • 有錯誤就 rollback TX,不用動腦讚拉

在 noSQL 的 2pc ,有一半以上的程式碼花在當機後怎來復原資料

  • Atomicity 保證系統數據安全地移到下一個正確狀態; Consistency 保證系統在移動失敗時,能安全地回到本來正確狀態。

Isolation

  • 同一筆資料,RDBMS 保證不會同時被兩個 TX access
  • 多層級的 Isolation ,能讓 application 只看到應該看到的資料
  • RDBMS 能自動管理 LOCK (自動避免 race condition) 。換言之,如果沒有 RDBMS 的 Isolation ,便需要額外的 locking 系統
  • 在 RDBMS 世界, update 會自動為受影響的數據加上 WRITE lock ,並且自動在 TX 結束時釋放,以保證一份資料不能被同時改動。
  • RDBMS 支持 atomic check-and-set 模式: 檢查用戶是否有足夠錢和改動戶口餘額是在同一 statement 內完成

Durability

  • 一旦 Committed 的資料改動,除非存儲空間受損,否則永不流失

MongoDB 標準設定是沒有等待 Disk WRITE 的成功寫入,對資料庫知識不足的使用者會造成當機時的數據流失。

  • 一旦斷電了, RDBMS 將會以 TX 為單位進行 Data Recovery ,保證資料庫不會停留在不正確的狀態。也就是說,RDBMS 的使用者不應該處理當機而發生的數據錯誤

References