網絡延遲,用戶連續點擊導致後臺重複執行一條數據,後臺怎麼防止?

貓嬸陛下


這是一個典型的防止重複提交的問題!實際場景中比如有重複扣款,重複購買的問題!

怎麼設計能防止重複提交呢?我們主要有以下操作:

①,前端:點擊提交的按鈕在點擊過後置灰,在一段時間之內不讓重複提交!

優點:最省事,提高併發能力的方式!

缺點:頁面刷新等情況js失效,前端容易被篡改!



②,後端:

1,加鎖:對提交的id進行加鎖操作,在一定的時間範圍內同樣的id只能通過一次!

如果是分佈式服務,需要藉助redis等來加分佈式鎖,不然多個服務中鎖不能互斥!


2,冪等:保證接口冪等,先查詢,如果記錄不存在再新增,如果存在就返回查詢結果!

缺點:高併發環境沒法保證冪等性!

③,數據庫:如果是新增,可加唯一字段,在保存的時候如果唯一字段重複會拋出異常,使用insert ignore語句,做判斷!

如果是修改,可以使用樂觀鎖sql,保證版本version滿足的時候再執行sql!如下例就是樂觀鎖機制:

update table_test set name=name1,version=version+1 where id=id1 and version=2;

我實際工作中就用到上面幾種方法,如果還有更為合適有效的方法,請補充。。筆者一直在持續的分享JAVA開發技術,其中不乏百贊好文,有需要的朋友可以關注下。。


哎喲JAVA不錯哦


這是一個很典型的節流問題

辦法一:簡單的辦法可以在點擊的時候給按鈕置為不可點擊狀態,等請求回來後再設置為可點擊

辦法二:在內存中記錄一個pending狀態記錄當前請求是否是發送中,如果是發送中就不重複發了,待請求回調回來後重置該狀態

辦法三:如果你是用的xhr發送的ajax請求,可以設置為發送同步請求

還是需要根據你所使用的技術棧來決定使用什麼辦法

關於節流的概念可以參考 高級程序設計



古士日1818188


樂觀鎖,還有session放操作id,如果有就允許點擊,如果沒有就不允許


分享到:


相關文章: