今天接著昨天沒介紹完的 ACID
Atomicity,指的是 transaction 是一個單一個工作單元,原子性的 transaction 代表整個 transaction 中如果其中一個操作失敗,就會 fail 或重來。也就是只有完成和未完成兩種狀態,不會有中間的狀態。
Conststency 確保每個 transaction 開始和結束時,資料庫都處於一致的狀態。換句話說,資料必須遵循所有的定義規則。完成一個 transaction 後,應轉到另一個一致的狀態。舉個例子,餘額不會有負數的出現,因此轉出的錢不能超過你的餘額,如果你轉出了餘額變負數,DB 就需要 ROLLBACK。
Isolation確保並發執行的 transaction 彼此之間不會互相影響。換句話說,transaction 在被提交 (commit) 前,其他 transaction 無法看到其未完成的結果。Isolation 避免了如髒讀(Dirty Reads)、不可重複讀(Non-repeating Reads)和幻讀(Phantom Read)等問題。
隔離層級 | Dirty Read | Unrepeatable Read | Phantom Read |
---|---|---|---|
Read uncommitted | YES | YES | YES |
Read committed | NO | YES | YES |
Repeatable read | NO | NO | YES |
Serializable | NO | NO | NO |
ithome=# SHOW TRANSACTION ISOLATION LEVEL;
transaction_isolation
-----------------------
read committed
單次的操作
BEGIN;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
這裡是 transaction 操作
COMMIT;
直接修改 postgresql.conf
restart postgresql 後再回到 DB
可以看到修改完後就會是 serializable
ithome=# SHOW TRANSACTION ISOLATION LEVEL;
transaction_isolation
-----------------------
serializable
Durability,指的就是變更寫入資料庫後,資料的修改就不會變了,即便系統故障也不會丟失。