← Foundations Course

FOUNDATIONS PHASE 2 · 21

SQL Transactions:多步 Operation 要嘛一起成功,要嘛一起失敗

單條 INSERT 不難;真正工程問題是「建立課程 + 建 audit log + 更新 quota」如果中途失敗怎麼辦。Transaction 是資料一致性的核心工具之一。

Learning outcomes

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:
ROLLBACK

Debug evidence

看到 duplicate/constraint violation、deadlock、timeout、partial state 時,先確認 transaction boundary、concurrent requests 與 DB logs,而不是只看 HTTP 500。

Knowledge check

  1. Transaction 解的是什麼問題?
  2. COMMIT / ROLLBACK 各代表什麼?
  3. 為什麼先查 quota 再 insert 可能 race?
  4. Transaction 和 CHECK constraint 差在哪?