[極短篇] 資料庫的 ACID 是什麼?


Posted by Lauviah0622 on 2021-04-24

本文章擷取自 程式導師實驗計畫第四期作業並做改寫

操作資料庫裏面有一個很重要的東西叫做 transaction。簡單說,就是一連串必須要一起進行的操作,如果一個操錯失敗,所以已經執行的操作都必須取消。例如:

A 匯錢給 B,必須要執行兩個步驟

  1. A.money -= 100
  2. B.money += 100

如果 1. 沒有完成 2. 完成了,那麼整個銀行就會憑空多 100$。如果 1. 完成 2. 沒有完成,那麼整個銀行就會憑空少 100$。這麼嚴重的事情我們當然不能容忍(尤其是後者),所以再處理這種 transcation 的操作時我們必須要特別注意四點事項: ACID

所以 ACID 就是在 database 上面處理 transaction 要注意的事項,大概就像洗手要濕搓沖捧擦這樣的口訣

  • Atomicity 原子性
    transaction 裡面的操作要馬全部成功,要馬全部失敗。這點蠻理所當然的,就像剛剛的舉例,如果 1. 成功 2. 不成功就會憑空多錢
  • Consistency 一致性
    不同的數據都會有一些基本的約束,而這些約束在交易前跟交易後都必須要遵守,如果沒辦法遵守交易就必須失敗,聽起來很抽象,舉剛剛的匯款的舉例,匯款有一些基本的限制:
    1. 雙方的錢都不能小於 0
    2. 雙方錢的總和不能改變
      上面兩個限制在交易前跟交易後都必須要遵守,這就是一致性。
  • Isolation 隔離性
    多個 transaction 不會互相干擾,不能修改到同一個值,例如

    A 交易:小明 要匯給 小華 100:

    1. 小明.money -= 100
    2. 小華.money += 100
      B 交易:小明 要匯錢給 阿雅 100
    3. 小明.money -= 100
    4. 阿雅.money += 100
      想像一下,如果 A 交易跟 B 交易同時進行。
    1. 執行 a.1 的操作,先看到小明有 500$
    2. b.1 也一起執行,也看到小明有 500$
    3. a.1 小明 -100$,然後幫小明標記為 400\$
    4. b.1 也幫小明 -100$,也幫小明標記為 400\$

    小明匯了兩筆錢,結果只扣到一筆的錢。所以 transation 在執行的時候必須要先把欄位鎖起來(不給操作),防止其他的操作也修改到同一個值。

  • Durability 持久性
    這個最簡單了,在 transaction 成功之後。就算 server 當機、斷電,已經修改的數據也不會不見,應該要被寫入能夠永久儲存的裝置中,而不是暫存。

參考資料:
https://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E5%BA%93%E4%BA%8B%E5%8A%A1


#Database







Related Posts

一步一步會留下足跡,一言一行會留下成績

一步一步會留下足跡,一言一行會留下成績

[第十周] 有點難分的 Session 和 Cookie

[第十周] 有點難分的 Session 和 Cookie

後端資料庫欄位型態與實作 Cookie

後端資料庫欄位型態與實作 Cookie


Comments