ACID 是什麼?請解釋 ACID 特性

2024年4月1日

💎 加入 E+ 成長計畫 與超過 500+ 位軟體工程師一同在社群中成長,並且獲得更多的軟體工程學習資源

在資料庫的領域當中,有個必須要知道的名詞 ACID,這個詞是由四個字所組成,透過這篇文章,我們一起來了解 ACID、討論 ACID 時有什麼思考點。

先聊聊交易 (transaction)

在講 ACID 之前,要先聊資料庫的交易 (transaction)。所謂的資料庫交易,可以理解成一系列對資料庫的讀取和寫入操作,而所有的操作都要能正常運行,交易才能提交;如果中間有任何的操作失敗,就會要把所有的操作都回滾。

白話一點理解,就是要不就都做,要不然就不做 (all or nothing)。舉例來說,如果今天 A 要轉帳 $1,000 元給 B,這個交易會含有的操作包含,把 A 的餘額減去 1,000,以及把 B 的餘額增加 1,000。如果在轉帳的過程中,銀行系統出問題,導致 A 的餘額減少,但是 B 的沒增加,那就會變得很棘手,為了避免這種狀況,全有或全無的特性就特別重要。

而 ACID 的特性,即是可以用來確保交易都是正確可靠,維護資料的完整性。讓我們進一步來了解 ACID 吧。

Atomicity (原子性)

ACID 的 A 是指原子性,所謂的原子性,是指一個交易中的操作,要不全部完成,要不全部失敗,這也是我們上面所提到的全有或全無的概念。原子性意味著,如果交易過程中,有任何操作失敗,整個交易都需要回滾,讓資料庫回到交易之前的狀態,這也是為什麼過去有人會說,可退回性 (abortability) 是原子性的關鍵。

Consistency (一致性)

ACID 的 C 是指一致性,所謂的一致性代表著,交易開始前與交易開始後,資料庫的完整性沒有被破壞。從轉帳的例子來說,如果原本 A 有 $1,000 元,B 有 $0 元,兩人共 $1,000 元,在完成轉帳後,總合仍是 $1,000 元,金額是穩定不變的。假如在轉完帳後,整個系統的金額變成負的,那就出大問題了,這也是為什麼保持一致性非常重要。

Isolation (隔離性)

ACID 的 I 是指隔離性,所謂的隔離性代表著交易之間不會互相干擾,一個交易內部的操作以及使用的資料,對於其他交易是相互隔離的。以轉帳的例子來說,A 轉帳給 B 這筆交易,跟 C 轉帳給 D 的交易彼此沒有影響。有隔離性的好處在於,如果有併發的交易,資料庫可以防止多個交易併發時交叉執行,導致資料不一致的狀況。

如果沒有做好隔離,可能會導致讀到髒資料 (dirty data),例如假如 A 交易讀取了某個 B 還沒有提交的交易,該交易把某個用戶的名字,從小鵬改成小傑,而 B 因為某些原因要回滾,所以命字變回小鵬,那麼 A 讀到的小傑,就會是有問題的。

另外,沒做好隔離,也會導致假如今天 C 交易還在進行時,D 交易對某個 C 正在更改的資料做讀取,重複讀取的過程如果 C 交易有改動,那 D 交易前後讀到的就會不一致。

Durability (持久性)

ACID 的 D 是指持久性,所謂的持久性意味對於資料的寫入是永久了,即使系統故障也不會丟失資料。舉例來說,今天你買了一張機票,資料庫記錄你購買的資訊,不會因為系統故障而丟失。

談論 ACID 時的思考點

關於 ACID,有幾個特別可以拉出來談的點,包含:

  • ACID 不是關聯資料庫獨有的

    過去談到 ACID 的特性,多數人會直接聯想到關聯資料庫 (RDBMS),或說 SQL 資料庫。確實關聯資料庫會有 ACID 的特性,但是現在有許多 NoSQL 資料庫,也有做到 ACID。

  • ACID 是種取捨

    上面提到 ACID 的特點,以及能帶來的好處。然而 ACID 也有顯而易見的問題。舉例來說,從 CAP 理論的角度來看,要能做到一致性,會犧牲可用性。而有些系統其實只需要最終一致性 (eventual consistency),這時就不一定要選具有 ACID 特性的資料庫,而是可以選擇對於可用性、吞吐量比較有幫助的方案。

  • 用思考框架來看 ACID 上

    面提到可以用 CAP 角度來看,除了 CAP 外,BASE (Basically Available, Soft state, Eventual consistency) 也是可以用來協助思考,也許不一定要做到完美的一致性。

🧵 如果你想收到最即時的內容更新,可以在 FacebookInstagram 上追蹤我們