在操作關聯式資料庫通常會有多個步驟,當把步驟打包成一包期望資料庫把這包步驟視為一個行為時,這包步驟就稱為交易(Transaction)
。在 RDB 中交易具有 ACID 特性。ACID 這個單字在化學指的是酸鹼中的酸,在資料庫領域則是四個特性的縮寫:Atomicity、Consistency、Isolation 和 Durability。
原子性表示將交易中的所有步驟視為一個最小單位,這些步驟要嘛一起成功,要嘛一起失敗,不存在部分成功的狀態。當裡面的步驟逐步執行,全部成功後,這個交易就成功了;若前面幾個步驟成功,但下一個步驟失敗,這時視為交易失敗,前面已經執行的步驟必須要 Rollback,讓資料變回交易前的狀態。
舉例來說,我購買貓罐頭透過轉帳的方式付款給賣家,這個行為分成兩個步驟:
交易將這兩個步驟包成一包,所以:
原子性確保不會發生錢從我的戶頭扣除卻沒成功進到賣家戶頭,錢就這樣消失了的問題。
一致性是指資料庫的狀態在交易前和交易後維持一致,所謂的資料庫狀態可以理解為在某個時間點上,整體資料的集合。強一致性代表在交易成功後,不論如何存取,都一定會獲得最新的值。同樣以銀行帳戶為例,所有人的帳戶總金額在交易前後維持一致,不會有錢憑空出現,也不會有錢憑空消失。
一致性有不同等級,後續幾天的文章會有更多探討。
隔離性確保當今天同時有兩個交易對同個資料進行操作時,彼此互相隔離不會干擾。隔離性又分成四種不同等級,由低至高分別為:Read uncommitted、Read committed、Repeatable reads 和 Serializable。例如,我戶頭裡目前有10000元,在我轉帳給貓罐頭賣家(A)的同時,信用卡公司也剛好從我的戶頭扣了這個月的卡費(B),下面這種情境是不允許
的:
在 A 交易完成前,B 交易不可以去異動我的戶頭金額,兩個交易同時去觸碰我的戶頭的結果,就會發生餘額錯誤的問題。
持久性表示一旦交易成功,操作的結果會被確實的保存下來。像是硬碟中的資料不會因重新開機而消失,因此資料存在硬碟中就具有持久性;但若資料只存在記憶體,不幸遇到停電電腦關機,重開後資料就消失了,則不具有持久性。