iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0

今天來聊聊大家都耳熟能詳的 ACID 。

What is ACID

ACID is an acronym that refers to the set of 4 key properties that define a transaction: Atomicity, Consistency, Isolation, and Durability.
https://ithelp.ithome.com.tw/upload/images/20240930/20150927fK1Hu4ozbl.png
圖片來源

ACID 是定義一個 transaction 的四種特性,分別是 Atomicity原子性、Consistency 一致性、Isolation 隔離性 & Durability 持久性。
如果有資料庫的操作具備這些特性,我們也可以叫他 ACID transaction。

What is transaction

雖然大家應該都很熟,但還是順便幫大家複習一下。
在資料庫中,一個 transcation 是一系列資料庫操作的集合,他可能是一個操作、新增和刪除,也有可能是許多操作,只要有一個操作出問題,所以的資料就會被回復到 transaction 前的樣子。他只有完成與未完成的狀態,不會有執行到一半中段還儲存的情況發生。

  • 完成: commit 提交
  • 失敗: roll back 回滾

舉一個最常見的例子,銀行轉帳,

  • A 帳戶:1000元 / B 帳戶: 500 元
  • A 轉帳 100 元給 B
  • A 的帳戶 1000 - 100 = 900 元
  • 這時候轉帳系統壞了
  • 如果沒有 transaction 會發生什麼事?
    • A 帳戶剩 900元 B 帳戶剩 500 元, 100 元憑空消失了!
  • 透過 transaction ROLLBACK
    • A 帳戶恢復成 1000 元,B 帳戶一樣是 500 元,重新再來一次!
      Why need transcation ?
  • 如剛剛的例子般,系統出問題是無法完全避免的,透過 transcation 我們可以讓這個結果是一致且可信賴。若系統發生問題,只要把所有 transaction 回復到出問題之前即可。
  • 如果同時有多組操作修改同一個帳戶的錢,transaction 可以透過隔離,讓帳戶的錢不會有錯誤。

transaction state
https://ithelp.ithome.com.tw/upload/images/20241001/20150927DnsOoKjQrd.png
圖片來源

transaction 的生命週期,有六個階段

  1. Active State – 當 transaction 開始執行 SQL 指令後,就是 Activate State。 假如全部的讀取和寫入的操作都沒有錯誤,就會進入 partially committed state。 如果有任何的 SQL 指令錯誤,他就會進入 failed state

  2. Partially Committed – 完成所有讀取和寫入的操作後,會把操作的變更儲存在記憶體或 local 的緩衝區。如果這些變更成功儲存的話,就會進入 committed state。反之,進入 failed state

  3. Failed State – 當 transaction 中的有任何指令失敗,或是在將變更寫入資料庫的時候失敗,就會進入 failed state

  4. Aborted State –如果執行指令時發生任何錯誤,交易會從 failed state 進入 Aborted State。並將之前的變更刪除或 ROLLBACK。

  5. Committed State – 當變更成功寫入資料庫後,就會進入 committed state

  6. Terminated State – 如果 transaction未被 ROLLBACK 或 來自committed state,則會進入Terminated State,並準備接受新的 transaction。

transaction in postgresql

用一個 postgres 文件中的例子來看一下他是怎麼在 postgresql 裡執行的。

BEGIN;
UPDATE accounts SET balance = balance - 100.00
    WHERE name = 'Alice';
SAVEPOINT my_savepoint;
UPDATE accounts SET balance = balance + 100.00
    WHERE name = 'Bob';
-- oops ... forget that and use Wally's account
ROLLBACK TO my_savepoint;
UPDATE accounts SET balance = balance + 100.00
    WHERE name = 'Wally';
COMMIT;

寫完發現來不及講 ACID 了,明天颱風假我們再繼續 ACID 吧 XD

Reference


上一篇
Day-16 | Postresql 資料回收機制 - VACUUM
下一篇
Day-18 | Database ACID transaction(2) feat. 髒讀、不可重複讀、幻讀& Postgresql
系列文
埋藏在後端工程下的地雷與寶藏30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言