iT邦幫忙

2022 iThome 鐵人賽

DAY 3
0
Software Development

NoSQL: Not Only SQL系列 第 3

[Day3] 關聯式資料庫交易的 ACID 特性

  • 分享至 

  • xImage
  •  

在操作關聯式資料庫通常會有多個步驟,當把步驟打包成一包期望資料庫把這包步驟視為一個行為時,這包步驟就稱為交易(Transaction)。在 RDB 中交易具有 ACID 特性。ACID 這個單字在化學指的是酸鹼中的酸,在資料庫領域則是四個特性的縮寫:Atomicity、Consistency、Isolation 和 Durability。

Atomicity 原子性

原子性表示將交易中的所有步驟視為一個最小單位,這些步驟要嘛一起成功,要嘛一起失敗,不存在部分成功的狀態。當裡面的步驟逐步執行,全部成功後,這個交易就成功了;若前面幾個步驟成功,但下一個步驟失敗,這時視為交易失敗,前面已經執行的步驟必須要 Rollback,讓資料變回交易前的狀態。

舉例來說,我購買貓罐頭透過轉帳的方式付款給賣家,這個行為分成兩個步驟:

  1. 從我的戶頭扣錢
  2. 在賣家的戶頭加錢

交易將這兩個步驟包成一包,所以:

  • 如果步驟1失敗,則交易失敗
  • 如果步驟1成功,步驟2失敗,則步驟1 Rollback,交易失敗
  • 如果步驟1成功,步驟2成功,則交易成功

原子性確保不會發生錢從我的戶頭扣除卻沒成功進到賣家戶頭,錢就這樣消失了的問題。

Consistency 一致性

一致性是指資料庫的狀態在交易前和交易後維持一致,所謂的資料庫狀態可以理解為在某個時間點上,整體資料的集合。強一致性代表在交易成功後,不論如何存取,都一定會獲得最新的值。同樣以銀行帳戶為例,所有人的帳戶總金額在交易前後維持一致,不會有錢憑空出現,也不會有錢憑空消失。

一致性有不同等級,後續幾天的文章會有更多探討。

Isolation 隔離性

隔離性確保當今天同時有兩個交易對同個資料進行操作時,彼此互相隔離不會干擾。隔離性又分成四種不同等級,由低至高分別為:Read uncommitted、Read committed、Repeatable reads 和 Serializable。例如,我戶頭裡目前有10000元,在我轉帳給貓罐頭賣家(A)的同時,信用卡公司也剛好從我的戶頭扣了這個月的卡費(B),下面這種情境是不允許的:

  1. (A-1) 我的戶頭扣款2000元,剩餘10000-2000=8000元
  2. (B-1) 我的戶頭扣款7000元,剩餘8000-7000=1000元
  3. (B-2) 信用卡公司戶頭增加7000元
  4. (A-2) 貓罐頭賣家戶頭增加2000元 失敗
  5. (A-1 Rollback) 我的戶頭為交易前的狀態,餘額10000元

在 A 交易完成前,B 交易不可以去異動我的戶頭金額,兩個交易同時去觸碰我的戶頭的結果,就會發生餘額錯誤的問題。

Durability 持久性

持久性表示一旦交易成功,操作的結果會被確實的保存下來。像是硬碟中的資料不會因重新開機而消失,因此資料存在硬碟中就具有持久性;但若資料只存在記憶體,不幸遇到停電電腦關機,重開後資料就消失了,則不具有持久性。


上一篇
[Day2] 資料庫的歷史:NoSQL 的出現
下一篇
[Day 4] NoSQL Database 的 BASE 特性
系列文
NoSQL: Not Only SQL30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言