同一筆 POST 來了兩次:如何處理 SQL 唯一鍵衝突與交易競爭

某次同事處理交易建立 API 時,系統突然出現 SQL Server 唯一鍵衝突。第一個直覺通常是:「是不是查詢重複資料的 SQL 壞了?」但往下追查後,真正的問題其實是兩個請求都認為資料不存在,接著一起嘗試新增。 資料庫只是最後那個說「不行」的人。 這類問題不能只靠捕捉 SQL 例外解決,也不能把責任全部推給前端重複送出。比較完整的做法,是先確認重複請求如何進入系統,再把交易建立流程改成冪等:同一筆請求不管送來幾次,系統都只建立一筆資料,並回傳一致的結果。 先確認我們到底看到了什麼 當 SQL Server 回報 2601 或 2627,能確定的事情只有一件:系統嘗試寫入一組已經存在的唯一鍵。 它不能直接證明: * 使用者連點兩次按鈕。 * 前端程式重複送出。 * 代理伺服器自動重試。 * 兩個請求一定同時執行。 * 第一個請求已經完整成功。 兩筆內容相同的 HTTP POST,只能證明接收端收到了兩個請求。至於它們是同時抵達、逾時重送,還是第一次成功後又送了一次,
繼續閱讀

使用 Windows `mklink` 整合多個專案資料夾,讓 Codex 能跨專案協作

在實際開發環境中,一套系統通常不會只有一個程式專案。 隨著系統持續發展,常常會拆成: * Web 專案 * API 專案 * Batch / Console Job * SQL Script * 共用 Library * 開發文件 * OpenSpec 規格 * AI Skill * 團隊共用 Skill 而這些專案也不一定放在同一個資料夾底下。 例如: D:\ ├─ Projects\ │ └─ WebApp\ │ ├─ DatabaseScripts\ │ E:\ ├─ Tools\ │ └─ BackgroundJob\ │ └─ SharedAI\ └─ TeamSkills\ 對一般 IDE 而言,這不一定是問題。 但當主要開發流程逐漸改成透過 Codex 協助時,就會遇到另一個需求: 如何讓 Codex 在同一個工作範圍內,同時理解並操作這些分散在不同位置的專案? 這篇文章記錄我最後使用 Windows mklink 建立整合 Workspace
繼續閱讀