iT邦幫忙

2023 iThome 鐵人賽

DAY 29
0

今天來點資料庫 Transaction 與 ACID!

前情提要

當我們試圖新增、修改或建立資料,
並在進行這些操作時發生無法將資料存入資料庫的情況,
資料庫會發生什麼事?

我用 Rails 建立的註冊功能,當要在使用者資料表中新增一個新的使用者,
可能由於某種原因(例如,唯一性約束違反或欄位的格式錯誤),
無法成功將新使用者的資料存入資料庫,就會出現這樣:
https://ithelp.ithome.com.tw/upload/images/20231012/20161764fmbmvrbF5P.png

仔細看會發現到我們觸發 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 成為一個關鍵的概念。

今天就到這啦!下篇見~!


參考資料:

文章同步於個人部落格:Viiisit!(歡迎參觀 ୧ʕ•̀ᴥ•́ʔ୨)


上一篇
Day 28 - 理解 Database - 資料庫正規化與反正規化!
下一篇
Day 30 - 理解 Git - 快速整裡出的 Git 常見指令!
系列文
從零開始,在 coding 路上的 30 個為什麼?不對!是無數個為什麼!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言