近期工作中遇到用戶重復提交表單信息情況,尤其是在網絡延時的情況下,用戶點擊提交按鈕后,頁面遲遲未響應,於是就會再次點擊提交按鈕。這樣就導致產生重復數據,會對后續的業務帶來一定問題。為此,查了一些資料,學習總結了下相關問題的解決思路。
首先,重復提交的問題,專業點的說法叫做接口冪等性問題。一個接口, 多次發起同一個請求,必須保證操作只能執行一次;出現這類問題的常見業務場景有:
**使用場景:
1.訂單接口(不能多次創建同一訂單)
2.支付接口, 重復支付同一筆訂單只能扣一次錢
3.支付寶回調接口,可能會多次回調, 必須處理重復回調
4.普通表單提交接口,因為網絡超時等原因多次點擊提交, 只能成功一次等等
**常用解決方案
1.唯一索引 -- 防止新增臟數據
2.token機制 -- 防止頁面重復提交
3.悲觀鎖 -- 獲取數據的時候加鎖(鎖表或鎖行)
4.樂觀鎖 -- 基於版本號version實現, 在更新數據那一刻校驗數據
5.分布式鎖 -- redis(jedis、redisson)或zookeeper實現
6.狀態機制 -- 狀態變更, 更新數據時判斷狀態