開發反饋:同一業務邏輯在網頁端因卡頓導致用戶連點提交按鈕,造成資料庫插入兩條內容完全相同、但自增主鍵 ID 不同的記錄。本文記錄問題分析、解決方案探討與最終落地過程。
SHOW CREATE TABLE HudsonResult;
# 關鍵結構
PRIMARY KEY (`ID`) -- 單一自增主鍵
# 無唯一索引約束業務字段
插入語句:
INSERT INTO HudsonResult (JobID, EnvironmentID, FirstSessionID, RerunSessionID, State, Desp, OtherInfo)
VALUES ((SELECT ID FROM Hudson WHERE ...), 0, 'N', 'N', 'N', 'smoke_test', '');
若在 (JobID, EnvironmentID, FirstSessionID, RerunSessionID, State, Desp, OtherInfo) 上建立唯一索引,可直接阻擋重複寫入。但開發表示業務邏輯複雜,難以確定唯一鍵組合,且 DDL 變更需審批流程較長。
START TRANSACTION;
SELECT 1 FROM HudsonResult WHERE ... FOR UPDATE;
-- 若不存在則 INSERT
COMMIT;
缺點:高併發下仍存在競態條件,需序列化鎖,效能損耗大。
依賴主鍵或唯一鍵判斷,因表無業務唯一鍵,無法直接應用。
經溝通,開發採用最簡單有效的方案:
disabled / 灰色狀態。優勢:零資料庫變更、零效能損耗、徹底解決「手抖連點」導致的重複提交,兼容所有業務場景。
本案例再次驗證:能在應用層解決的問題,絕不拖到資料庫層面硬扛。