今天來點資料庫 Transaction 與 ACID!
前情提要
當我們試圖新增、修改或建立資料,並在進行這些操作時發生無法將資料存入資料庫的情況,
資料庫會發生什麼事?
我用 Rails 建立的註冊功能,當要在使用者資料表中新增一個新的使用者,可能由於某種原因(例如,唯一性約束違反或欄位的格式錯誤),無法成功將新使用者的資料存入資料庫,就會出現這樣:
仔細看會發現到我們觸發 Transaction 的回滾(Rollback)!
但是,為什麼會這樣?我們接著往下看:
Database Transaction 交易(事務)
Database Transaction 稱為資料庫交易或者事務,以下直接用 Transaction 來表示。
Transaction 是資料庫管理系統中的重要概念,用於確保資料庫操作的一致性、完整性和持久性,
而在資料庫操作中,Transaction 是一組相關的操作被視為一個不可分割的工作,要麼全部成功執行,要麼全部失敗,不允許中途取消或中斷。
Transaction 這個工作單元可以包含一個或多個資料庫操作,例如讀取資料、寫入資料或更新資料,而這些操作必須以原子性的方式執行。原子性意味著無論何時,這個工作單元的操作要麼全部完成並永久保存到資料庫,要麼全部回滾並恢復到操作之前的狀態。
透過簡單的轉帳功能來看看 Transaction 的整體操作:
- Step 01:
當 Transaction 開始,就需要讀取帳戶 A 和帳戶 B 的當前餘額,
以確保進行轉帳之前的餘額狀態。 - Step 02:
確認之後開始執行轉帳,Transaction 扣減帳戶 A 的餘額,並增加帳戶 B 的餘額,
以完成轉帳操作,其中也包括更新資料庫中的帳戶 A 和帳戶 B 的餘額。 - Step 03:
Transaction 確保轉帳後,總帳戶餘額保持不變。這是確保操作的一致性的關鍵部分。
如果帳戶餘額不平衡,可能由於錯誤,Transaction 會 Rollback(回滾),並不執行。 - Step 04:
如果一切順利,Transaction 會 Commit(提交),
確保帳戶餘額的更改永久保存到資料庫中,這樣才能實現Transaction的持久性,
也 Transaction 確保了轉帳操作的可靠性和安全性。
如果在 Transaction 的任何階段出現問題,例如帳戶餘額不足或系統故障,Transaction 會被 Rollback(回滾),這意味著所有操作都會取消,以確保帳戶的一致性和完整性。這個過程確保了即使在不確定情況下,轉帳操作也不會導致資料庫狀態的混亂或錯誤。
Transaction 四大特性:ACID
在資料庫管理中,確保數據的完整性和可靠性是很重要的,
因此,我們需要謹慎管理資料庫操作,特別是當多個操作需要以原子方式執行時。
這就是接下來要說明的 Transaction 四大特性 - ACID:
原子性(Atomicity)
這表示 Transaction 中的所有操作要麼全部成功執行,要麼全部失敗,
不會留下部分完成的操作。
如果有一個操作失敗,整個 Transaction 都會被 Rollback(回滾)到最初的狀態,
並保持資料的一致性。一致性(Consistency)
這表示 Transaction 在執行前和執行後,資料庫都必須保持一致的狀態。
這意味著 Transaction 的執行不會破壞資料庫的完整性約束和規則。隔離性(Isolation)
這指的是多個 Transaction 在同時執行時,彼此互不影響,
每個 Transaction 都好像在單獨使用資料庫一樣。
這防止了一個 Transaction 的修改對其他 Transaction 可見,直到他完成。持久性(Durability)
這表示一旦 Transaction 成功完成,其對資料庫的修改將被永久保存,
即使在系統發生故障或重啟後也是如此。
這確保了資料的持久性,不會因系統錯誤而丟失。
這些特性確保每個 Transaction 都能夠安全、可靠地執行。
Transaction 的使用對於保證資料庫的完整性和可靠性非常重要,
特別是在多用戶環境下,其中多個用戶可以同時訪問和修改資料庫。
當一組操作需要以原子方式執行,以確保資料的一致性時,Transaction 成為一個關鍵的概念。
今天就到這啦!下篇見~!
參考資料:
➫ [極短篇] 資料庫的 ACID 是什麼?
➫ ACID 是什麼?請解釋 ACID 特性?
➫ Database Transaction & ACID