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

貓嬸陛下


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

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

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

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

缺點:頁面刷新等情況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工程師的話,給你幾條建議:

對於數據庫,可以通過增加唯一字段來確定,如果在新增的時候,唯一字段重複了,則拋出異常;如果是修改,利用樂觀鎖的方法實現.保證version滿足的時候在執行,這樣就是可以的了。

update table _test set name = name1,version = version+1 where id =1 and verison =2

還有高級的方法:冪等,保證接口冪等,先查詢,如果記錄不存在再新增,如果存在就返回查詢結果。

具體如何使用這些方法需要根據實際問題及項目狀況來選擇。


一郭鮮


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

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

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

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

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

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



古士日1818188


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


分享到:


相關文章: