今天來聊聊大家都耳熟能詳的 ACID 。
ACID is an acronym that refers to the set of 4 key properties that define a transaction: Atomicity, Consistency, Isolation, and Durability.
圖片來源
ACID 是定義一個 transaction 的四種特性,分別是 Atomicity
原子性、Consistency
一致性、Isolation
隔離性 & Durability
持久性。
如果有資料庫的操作具備這些特性,我們也可以叫他 ACID transaction。
雖然大家應該都很熟,但還是順便幫大家複習一下。
在資料庫中,一個 transcation 是一系列資料庫操作的集合,他可能是一個操作、新增和刪除,也有可能是許多操作,只要有一個操作出問題,所以的資料就會被回復到 transaction 前的樣子。他只有完成與未完成的狀態,不會有執行到一半中段還儲存的情況發生。
舉一個最常見的例子,銀行轉帳,
transaction state
圖片來源
transaction 的生命週期,有六個階段
Active State – 當 transaction 開始執行 SQL 指令後,就是 Activate State。 假如全部的讀取和寫入的操作都沒有錯誤,就會進入 partially committed state
。 如果有任何的 SQL 指令錯誤,他就會進入 failed state
。
Partially Committed – 完成所有讀取和寫入的操作後,會把操作的變更儲存在記憶體或 local 的緩衝區。如果這些變更成功儲存的話,就會進入 committed state
。反之,進入 failed state
。
Failed State – 當 transaction 中的有任何指令失敗,或是在將變更寫入資料庫的時候失敗,就會進入 failed state
。
Aborted State –如果執行指令時發生任何錯誤,交易會從 failed state
進入 Aborted State
。並將之前的變更刪除或 ROLLBACK。
Committed State – 當變更成功寫入資料庫後,就會進入 committed state
。
Terminated State – 如果 transaction未被 ROLLBACK
或 來自committed state
,則會進入Terminated State
,並準備接受新的 transaction。
用一個 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