FOUNDATIONS PHASE 2 · 21
SQL Transactions:多步 Operation 要嘛一起成功,要嘛一起失敗
單條 INSERT 不難;真正工程問題是「建立課程 + 建 audit log + 更新 quota」如果中途失敗怎麼辦。Transaction 是資料一致性的核心工具之一。
Learning outcomes
- 能解釋 transaction boundary。
- 能描述 COMMIT / ROLLBACK。
- 能辨識 read-modify-write race。
- 能區分 transaction、constraint、application validation。
1. 多步 Operation
INSERT course
INSERT audit_log
UPDATE user_quota如果第一步成功、第二步失敗、第三步沒執行,資料可能進入不一致狀態。
2. Transaction
BEGIN;
INSERT INTO courses ...;
INSERT INTO audit_log ...;
UPDATE quotas ...;
COMMIT;若中途發生無法接受的錯誤,就 rollback 整組 operation。
3. Rollback
BEGIN;
UPDATE accounts
SET balance = balance - 100
WHERE id = 1;
-- next step fails
ROLLBACK;Rollback 的目的是不要留下只有一半完成的 business operation。
4. Concurrency
A reads quota = 1
B reads quota = 1
A inserts
B inserts
Result:
quota may be exceeded單純在 application 先 SELECT 再 INSERT 可能 race;transaction/isolation/atomic SQL/constraint 需要一起設計。
5. Constraint 仍然重要
UNIQUE(owner_id, title)
CHECK(score BETWEEN 0 AND 100)Transaction 保護一組 operations;constraint 保護資料最終允許的 state。兩者不是互相取代。
Project checkpoint:Course Create Transaction
BEGIN
validate current quota
insert course
insert audit event
increment usage
COMMIT
On failure:
ROLLBACKDebug evidence
看到 duplicate/constraint violation、deadlock、timeout、partial state 時,先確認 transaction boundary、concurrent requests 與 DB logs,而不是只看 HTTP 500。
Knowledge check
- Transaction 解的是什麼問題?
- COMMIT / ROLLBACK 各代表什麼?
- 為什麼先查 quota 再 insert 可能 race?
- Transaction 和 CHECK constraint 差在哪?