跳轉到

ClaimMarker Pattern (PostgreSQL Idempotency)

概念概覽

ClaimMarker 核心語義

核心知識

ClaimMarker 核心語義

ClaimMarker 的正確實作順序: 1. INSERT INTO claim_markers ... ON CONFLICT DO NOTHING RETURNING id 2. 依據是否有回傳列(returned row)決定是否執行 grant

關鍵點:PostgreSQL 的 INSERT ... ON CONFLICT DO NOTHING 在衝突時會**阻塞**其他 transaction,直到原始 transaction commit 或 rollback,這提供了正確的並發保護語義。這不是「先查後寫」(TOCTOU 漏洞),而是原子性的「claim-first」flow。

適用條件

  • 需要有外層 session-level guard(如 dungeon session lock)保護等待成本
  • ClaimMarker 引入額外 DB write,但換取的是正確的並發語義(非 double-grant 保證)
  • AuditRepository mock 必須更新以反映 claim-first flow,否則 unit test 驗不到正確行為

經驗教訓

  • PostgreSQL INSERT...ON CONFLICT DO NOTHING RETURNING 的阻塞語義是 ClaimMarker 能消除 TOCTOU 的根本原因,不是 application-level 的 check-then-act

  • ClaimMarker migration 後 distributor_test.go 的 AuditRepository mock 必須同步更新,否則測試驗證的是舊 flow

常見陷阱

  • 誤用「先查後寫」(SELECT 檢查 + 條件 INSERT)無法解決 TOCTOU,兩個並發請求都可能通過 SELECT 檢查

  • 只有 INSERT...ON CONFLICT DO NOTHING RETURNING 才有正確的 row-level blocking 語義

最佳實踐

  • ClaimMarker 必須搭配外層 session-level guard,降低 blocking 等待成本

  • Claim-first flow 的 unit test 必須驗證「有 RETURNING 列」與「無 RETURNING 列」兩條 code path

相關概念

來源 Sessions

日期 Session 貢獻摘要

| 2026-03-22 | 4d2cd4bd-d412-452e-8787-2ed0d493c165 | 明確定義 ClaimMarker 的 PostgreSQL 並發語義:利用 row-level blocking 消除 TOCTOU race condition |


本概念頁面由 Semi-Brain Wiki 系統自動維護

最後更新: 2026-03-22