利用資料庫是否更新驗證
新建乙個欄位version,每次更新的時候要求version都為0,更新後version加1,判斷更新是否成功來判斷是否重複提交。
基於快取資料狀態的驗證(讀取nosql資料需要時間,仍然會有重複)
將更新的id儲存到nosql中,判斷nosql中是否存在id 再更新。
利用資料庫唯一索引機制的驗證
新建一張表,業務id使用唯一索引,更新資料以前,將業務id插入該錶,如果成功,再執行更新操作。
基於資料庫的驗證(微小概率存在重複)
先查詢資料庫,驗證是否第一次操作,然後更新資料。注意查詢和更新之間不要做其他操作。
基於快取的計數器驗證(推薦)
由於資料庫的操作比較消耗效能,了解到redis的計數器也是原子性操作。果斷採用計數器。既可以提高效能,還不用儲存,而且能提公升qps的峰值。
還是以訂單退款為例子:
每次request進來則新建乙個以orderid為key的計數器,然後+1。
如果》1(不能獲得鎖): 說明有操作在進行,刪除。
如果=1(獲得鎖): 可以操作。
操作結束(刪除鎖):刪除這個計數器。
後端介面防止重複提交 確認收貨防止重複提交
1 在呼叫介面時候肯定會出現ab同事請求介面的問題,當時我在做訂單確認收貨時候就遇到了這種問題,所以我的解決辦法是加上鎖來解決,在這裡我選擇用lock 裡的reentrantlock 在使用者請求方法時候,獲取到使用者id,放入lock,這也同乙個介面如果是2個相同使用者ab同時確認收貨時候,先到先...
前後端分離重複提交 防止表單重複提交(二)
實現原理 1 頁面和後台同步存入乙個token,一旦重新整理頁面,此token都是會重新整理的 2 提交表單時,會帶上這個標識token 3 請求後台,將此token和後台存入的token比對 3.1 校驗token通過,成功提交表單,並移除token 3.2 校驗token不通過,給出前端提示,但...
Vue實現節流,防止重複提交
1 在methods中定義節流函式 desc 函式節流,規定在乙個單位時間內,只能觸發一次函式,如果這個單位時間內觸發多次函式,只有一次生效 典型的案例就是滑鼠不斷點選觸發,規定在n秒內多次點選只有一次生效。param func 函式 param wait 延遲執行毫秒數 throttle func...