中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java高并發下怎么保證接口的冪等性

發布時間:2021-10-29 20:46:18 來源:億速云 閱讀:422 作者:iii 欄目:開發技術

本篇內容介紹了“Java高并發下怎么保證接口的冪等性”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

前端保證冪等性的方法

按鈕只能點擊一次

用戶點擊按鈕后將按鈕置灰,或者顯示loading狀態

RPG模式

即Post-Redirect-Get,當客戶提交表單后,去執行一個客戶端的重定向,轉到提交成功頁面。避免用戶按F5刷新導致的重復提交,也能消除按瀏覽器后退鍵導致的重復提交問題。目前絕大多數公司都是這樣做的,比如淘寶,京東等

后端保證冪等性的方法

使用唯一索引

對業務唯一的字段加上唯一索引,這樣當數據重復時,插入數據庫會拋異常

狀態機冪等

如果業務上需要修改訂單狀態,例如訂單狀態有待支付,支付中,支付成功,支付失敗。設計時最好只支持狀態的單向改變。這樣在更新的時候就可以加上條件,多次調用也只會執行一次。例如想把訂單狀態更新為支持成功,則之前的狀態必須為支付中

update table_name set status = 支付成功 where status = 支付中

樂觀鎖實現冪等

  1. 查詢數據獲得版本號

  2. 通過版本號去更新,版本號匹配則更新,版本號不匹配則不更新

-- 假如查詢出的version為1

-- 假如查詢出的version為1 select version from table_name where userid = 10; -- 給用戶的賬戶加10 update table_name set money = money -10, version = version + 1 where userid = 10 and version = 1

也可以通過條件來實現樂觀鎖,如庫存不能超賣,數量不能小于0

update table_name set num = num - 10 where num - 10 >= 0

防重表

增加一個防重表,業務唯一的id作為唯一索引,如訂單號,當想針對訂單做一系列操作時,可以向防重表中插入一條記錄,插入成功,執行后續操作,插入失敗,則不執行后續操作。本質上可以看成是基于MySQL實現的分布式鎖。根據業務場景決定執行成功后,是否刪除防重表中對應的數據

分布式鎖實現冪等

執行方法時,先根據業務唯一的id獲取分布式鎖,獲取成功,則執行,失敗則不執行。分布式鎖可以基于redis,zookeeper,mysql來實現,分布式鎖的細節就不介紹了

select+insert

先查詢一下有沒有符合要求的數據,如果沒有再執行插入。沒有并發的系統中可以保證冪等性,高并發下不要用這種方法,也會造成數據的重復插入。我一般做消息冪等的時候就是先select,有數據直接返回,沒有數據加分布式鎖進行insert操作

全局唯一號實現冪等

通過source(來源)+  seq(序列號)來判斷請求是否重復,重復則直接返回請求重復提交,否則執行。如當多個三方系統調用服務的時候,就可以采用這種方式

“Java高并發下怎么保證接口的冪等性”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

肇州县| 南开区| 合川市| 杭锦旗| 乡宁县| 商洛市| 修水县| 依兰县| 云林县| 崇左市| 清水河县| 青神县| 图们市| 盐城市| 华蓥市| 嘉义县| 太和县| 威信县| 昌邑市| 福海县| 泰宁县| 社旗县| 微山县| 毕节市| 德阳市| 古丈县| 电白县| 松桃| 东乡族自治县| 延川县| 府谷县| 汉寿县| 洞头县| 桓仁| 兰考县| 鹤壁市| 西乌| 邵东县| 苍南县| 贵定县| 巨鹿县|