本文章擷取自 程式導師實驗計畫第四期作業並做改寫
操作資料庫裏面有一個很重要的東西叫做 transaction。簡單說,就是一連串必須要一起進行的操作,如果一個操錯失敗,所以已經執行的操作都必須取消。例如:
A 匯錢給 B,必須要執行兩個步驟
- A.money -= 100
- B.money += 100
如果 1. 沒有完成 2. 完成了,那麼整個銀行就會憑空多 100$。如果 1. 完成 2. 沒有完成,那麼整個銀行就會憑空少 100$。這麼嚴重的事情我們當然不能容忍(尤其是後者),所以再處理這種 transcation 的操作時我們必須要特別注意四點事項: ACID
所以 ACID 就是在 database 上面處理 transaction 要注意的事項,大概就像洗手要濕搓沖捧擦這樣的口訣
- Atomicity 原子性
transaction 裡面的操作要馬全部成功,要馬全部失敗。這點蠻理所當然的,就像剛剛的舉例,如果 1. 成功 2. 不成功就會憑空多錢 - Consistency 一致性
不同的數據都會有一些基本的約束,而這些約束在交易前跟交易後都必須要遵守,如果沒辦法遵守交易就必須失敗,聽起來很抽象,舉剛剛的匯款的舉例,匯款有一些基本的限制:- 雙方的錢都不能小於 0
- 雙方錢的總和不能改變
上面兩個限制在交易前跟交易後都必須要遵守,這就是一致性。
Isolation 隔離性
多個 transaction 不會互相干擾,不能修改到同一個值,例如A 交易:小明 要匯給 小華 100:
- 小明.money -= 100
- 小華.money += 100
B 交易:小明 要匯錢給 阿雅 100 - 小明.money -= 100
- 阿雅.money += 100
想像一下,如果 A 交易跟 B 交易同時進行。
- 執行 a.1 的操作,先看到小明有 500$
- b.1 也一起執行,也看到小明有 500$
- a.1 小明 -100$,然後幫小明標記為 400\$
- 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