精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

大廠都怎么防止重復下單?

數據庫 Oracle
Order服務調用Pay服務,剛好網絡超時,然后Order服務開始重試機制,于是Pay服務對同一支付請求,就接收到了兩次,而且因為輪詢負載均衡算法,落在了不同業務節點!所以一個分布式系統接口,須保證冪等性。

1.問題背景

最簡單的:DB事務。如創建訂單時,同時往訂單表、訂單商品表插數據,這些Insert須在同一事務執行。

Order服務調用Pay服務,剛好網絡超時,然后Order服務開始重試機制,于是Pay服務對同一支付請求,就接收到了兩次,而且因為輪詢負載均衡算法,落在了不同業務節點!所以一個分布式系統接口,須保證冪等性。

2.如何避免重復下單?

前端頁面也可直接防止用戶重復提交表單,但網絡錯誤會導致重傳,很多RPC框架、網關都有自動重試機制,所以重復請求在前端側無法完全避免!問題最后還是如何保證服務接口的冪等性。

2.1 如何判斷請求是重復的?

  • 插入訂單前,先查一下訂單表,有無重復訂單? 不優:難以用SQL條件定義到底什么是“重復訂單”
  • 訂單的用戶、商品、價格一樣就是重復訂單? 萬一這用戶就是連續下了倆一模一樣訂單呢?

所以保證冪等性要做到:

2.1.1 每個請求須有唯一標識

比如訂單支付請求,得包含訂單id,一個訂單id最多只能成功支付一次。

2.1.2 每次處理完請求后,須有記錄標識該請求已被處理

在MySQL中記錄一個狀態字段。如支付之前記錄一條這個訂單的支付流水。

2.1.3 每次接收請求時,判斷之前是否處理過

若有一個訂單已支付,就肯定已有一條支付流水。若重復發送這個請求,則此時先插入支付流水,發現orderId已存在,唯一約束生效,報錯重復Key。就不會再重復扣款。

在往DB插記錄時,一般不提供主鍵,而由DB在插入時自動生成。這樣重復的請求就會導致插入重復的數據。MySQL的主鍵自帶唯一性約束,若在一條INSERT語句提供主鍵,且該主鍵值在表中已存在,則該條INSERT會執行失敗。因此可利用DB的“主鍵唯一約束”,在插數據時帶上主鍵,以此實現創建訂單接口的冪等性。

給Order服務添加一個“orderId生成”的接口,無參,返回值就是一個【全局唯一】訂單號。在用戶進入創建訂單頁面時,前端頁面先調用該orderId生成接口得到一個訂單號,在用戶提交訂單時,在創建訂單的請求中攜帶該訂單號。

該訂單號其實就是訂單表的主鍵,于是,重復請求中帶的都是同一訂單號。訂單服務在訂單表中插入數據的時候,執行的這些重復INSERT語句中的主鍵,也都是同一個訂單號。而DB唯一約束保證,只有一次INSERT執行成功。

實際要結合業務,如使用Redis,用orderId作為唯一K。只有成功插入這個支付流水,才可執行扣款。

要求是支付一個訂單,須插入一條支付流水,order_id建立一個唯一鍵。你在支付一個訂單前,先插入一條支付流水,order_id就已經傳過去了。就能寫一個標識到Redis中,set order_id payed,當重復請求過來時,先查Redis的order_id對應的value,若為payed說明已支付,就別再重復支付!

然后再重復支付訂單時,寫嘗試插入一條支付流水,DB會報唯一鍵沖突,整個事務回滾。保存一個是否處理過的標識也可以,服務的不同實例可以一起操作Redis。

圖片

若因重復訂單導致插入 t_order 失敗,則Order服務不要把該錯誤返給前端頁面。否則,就可能出現用戶點擊創建訂單按鈕后,頁面提示創建訂單失敗,而實際上訂單創建成功了。

正確做法:這種case,訂單服務直接返回訂單創建成功。

3.解決ABA

3.1 什么是ABA

如訂單支付后,seller要發貨,發貨完成后要填個快遞單號。假設seller填個666,剛填完,發現填錯了,趕緊再修改成888。對訂單服務,這就是2個更新訂單的請求。系統異常時666請求到了,單號更成666,接著888請求到了,單號又更新成888,但是666更新成功的響應丟了,調用方沒收到成功響應,自動重試,再次發起666請求,單號又被更新成666了,這數據顯然就錯了!

圖片

3.2 解決方案

訂單主表增加version列。每次查詢訂單時,版本號要隨著訂單數據返回給頁面。頁面在更新數據的請求中,把這個版本號作為更新請求的參數,帶回給訂單更新接口。

訂單服務在更新數據的時候,需要比較訂單的版本號是否和消息中的一致:

  • 不一致拒絕更新數據
  • 一致還需再更新數據的同時,將version+1。“比較版本號、更新數據和版本號+1”的過程須在同一事務執行
UPDATE orders set tracking_number = 666,
version = version + 1
WHERE version = 8;

在這條SQL的WHERE條件中,version值需要頁面在更新的時候通過請求傳進來。

通過該版本號,就能保證,從我打開這條訂單記錄開始,一直到我更新這條訂單記錄成功,期間沒有其他人修改過該訂單數據。若有,則DB中的version就會改變,那我的更新操作就會執行失敗。我就只能重新查詢新版本的訂單數據,再嘗試更新。

有了這個版本號,前文的ABA即有兩個case:

  •  把運單號更新為666成功,更新為888的請求帶著舊版本號,就更新失敗,頁面提示用戶更新888失敗
  • 666更新成功后,888帶著新版本號,888更新成功。這時即使重試的666請求再來,因為它和上一條666請求帶相同版本號,上一條請求更新成功后,這個版本號已經變了,所以重試請求的更新必然失敗

無論哪種情況,DB中的數據與頁面上給用戶的反饋都是一致的。這就實現了冪等更新且避免ABA。

圖片

4.總結

  • 創建訂單服務,可通過預生成訂單號,然后利用DB的訂單號唯一約束,避免重復寫入訂單,實現創建訂單服務的冪等性
  • 更新訂單服務,通過一個版本號機制,每次更新數據前校驗版本號,更新數據同時自增版本號,這樣的方式,來解決ABA問題,確保更新訂單服務的冪等性

兩種冪等的實現方法,就可以保證,無論請求是不是重復,訂單表中的數據都是正確的。

實現訂單冪等的方法,完全可以套用在其他需要實現冪等的服務中,只需要這個服務操作的數據保存在數據庫中,并且有一張帶有主鍵的數據表即可。

責任編輯:武曉燕 來源: JavaEdge
相關推薦

2024-08-06 08:13:26

2025-04-27 01:22:00

QPS高并發MySQL

2022-11-11 07:34:43

2022-11-15 07:39:48

2013-11-13 11:01:14

表單表單重復提交表單策略

2022-11-17 07:43:13

2025-04-14 00:00:00

數據庫分布式架構分布式鎖?

2013-11-13 14:39:53

表單提交開發

2024-12-16 00:54:05

2020-07-17 07:59:55

數據

2024-06-06 08:46:37

2020-12-01 11:13:00

MySQL8

2025-10-11 09:21:35

2025-04-01 08:10:00

JavaScripteval()函數代碼

2024-08-05 09:29:00

前端接口請求

2025-10-16 08:25:31

2021-02-02 16:37:25

Redis分布式

2025-02-26 07:53:21

2020-11-16 09:15:07

MYSQL

2010-11-23 16:56:04

mysql表單
點贊
收藏

51CTO技術棧公眾號

日韩免费小视频| 国产小视频在线观看| 在线精品视频在线观看高清| 日韩欧美国产综合| 黄色www网站| 成人不用播放器| 国产成人免费视频| 国产成人一区二区三区| 日韩在线中文字幕视频| 色88888久久久久久影院| 欧美日韩一区高清| 精品成在人线av无码免费看| 国产永久免费高清在线观看视频| 国产精品69久久久久水密桃| 欧美在线一级va免费观看| 国产3级在线观看| 亚洲成a人片77777在线播放| 欧美一区二区网站| 成熟老妇女视频| 性直播体位视频在线观看| 久久久国产午夜精品| aa成人免费视频| 精品国产www| 一区二区毛片| 九色成人免费视频| 亚洲色图 激情小说| 欧美色资源站| 精品国产一区二区三区忘忧草| 日韩一级理论片| 欧美gv在线| 一区二区三区久久久| 亚洲一区二区三区午夜| 天天色综合久久| 国产精品亚洲人在线观看| 国产精品一区二区久久国产| 久久99国产综合精品免费| 欧美黄免费看| 久久影院中文字幕| jizzjizz日本少妇| av在线不卡顿| 亚洲视频在线观看网站| 三级男人添奶爽爽爽视频 | 欧美在线不卡区| 久久久久久久久久99| 一区二区三区午夜视频| 日韩中文字幕在线播放| 懂色av粉嫩av浪潮av| 国产精品一区二区av交换| 亚洲男人天堂视频| 国产女主播喷水高潮网红在线| 久久久亚洲欧洲日产| 亚洲第一国产精品| 韩国三级hd两男一女| 国产精品毛片久久久| 精品国产百合女同互慰| 中文字幕无人区二| 91麻豆精品激情在线观看最新| 日韩欧美电影一区| 国产成人精品一区二区三区在线观看| 日韩区欧美区| 亚洲精品一区二区在线观看| 一级黄色片毛片| 精品少妇3p| 精品亚洲永久免费精品 | 国产精品久久久99| 一区二区三区四区不卡| 久操视频在线播放| 一区二区三区四区高清精品免费观看| 第九区2中文字幕| 国产盗摄在线视频网站| 午夜精品福利久久久| 激情伊人五月天| 日日夜夜天天综合| 欧美日韩精品一区视频| 69久久精品无码一区二区| 伊人精品综合| 精品视频—区二区三区免费| av中文字幕免费观看| 欧美r级电影| 欧美韩国理论所午夜片917电影| 日韩三级小视频| 日韩成人一区二区| 成人在线视频网| 亚洲高清视频网站| 久久婷婷国产综合国色天香| 亚洲精品一区二区三| 成人在线视频亚洲| 欧美日韩国产精品一区二区三区四区 | 欧美视频在线一区二区三区 | 亚洲免费色视频| 玩弄中年熟妇正在播放| 91av一区| 日韩视频不卡中文| 全黄一级裸体片| 欧美aa国产视频| 国产成人精品电影久久久| 国产精品一品二区三区的使用体验| 成人午夜伦理影院| 亚洲.欧美.日本.国产综合在线| 在线看福利影| 91黄色激情网站| 无码人妻久久一区二区三区蜜桃| 九九亚洲视频| 欧美丰满少妇xxxxx| 91porny九色| 国产91精品免费| 婷婷久久青草热一区二区| 国产经典三级在线| 欧美久久久久久久久中文字幕| 日韩av手机在线播放| 天天精品视频| 日韩av大片免费看| 黄色一级大片在线免费看国产一| 日本一区二区三区国色天香| 亚洲一区二区三区av无码| 久久青草免费| 亚洲人成亚洲人成在线观看| 久久精品久久国产| 韩国视频一区二区| 天堂va久久久噜噜噜久久va| av资源网在线播放| 欧美一区二区国产| 日韩欧美视频免费观看| 老司机免费视频久久| 国产日韩欧美一区二区| 1区2区3区在线视频| 欧美精品一卡两卡| 国产精品免费无码| 亚洲欧美日韩国产一区| 国产偷国产偷亚洲高清97cao| 黄色网址在线免费| 欧美日韩精品电影| 国产aaaaaaaaa| 日韩专区中文字幕一区二区| 久久久久久久久久久一区| 欧美女同一区| 日韩精品一区二区三区视频在线观看| 日本免费网站视频| 黄网站免费久久| 中文字幕不卡每日更新1区2区| a∨色狠狠一区二区三区| 亚洲欧美精品一区二区| 视频一区二区三区四区五区| 成人免费毛片嘿嘿连载视频| 韩日视频在线观看| a看欧美黄色女同性恋| 欧美高跟鞋交xxxxhd| www.xxx国产| 有码一区二区三区| 制服.丝袜.亚洲.中文.综合懂 | 久久精品国产精品亚洲| 91国内精品视频| 中文字幕一区二区在线播放| 爱爱爱爱免费视频| 欧美在线看片| 91精品国产综合久久久久久蜜臀 | 日韩有码av| 久久久在线观看| 男人天堂综合网| 午夜亚洲福利老司机| 国产熟女高潮一区二区三区 | 日韩在线不卡一区| 99久久亚洲精品蜜臀| 成人激情视频网| av免费在线观看网址| 亚洲精品一区二区三区香蕉| 国产真实的和子乱拍在线观看| 成人av电影免费观看| 亚洲欧洲日产国码无码久久99 | 亚洲欧洲精品一区二区| 在线免费成人| 久久久久久久久久久人体| 婷婷av一区二区三区| 欧美天堂在线观看| 少妇一级黄色片| 国产一区中文字幕| 每日在线观看av| 精品国精品国产自在久国产应用| 国产日韩欧美中文| 女人天堂av在线播放| 亚洲精品中文字幕有码专区| 亚洲天堂999| 一区二区三区国产豹纹内裤在线| jizz日本免费| 久久精品国产第一区二区三区| 男人天堂网站在线| 亚洲婷婷伊人| 亚洲精品日韩激情在线电影| 大菠萝精品导航| 色爱av美腿丝袜综合粉嫩av| 国精品人妻无码一区二区三区喝尿| 色综合亚洲欧洲| 欧美在线视频第一页| 99久久99久久综合| 向日葵污视频在线观看| 国产一区日韩一区| 亚洲午夜精品国产| 精品少妇3p| 亚洲japanese制服美女| 国产不卡网站| 欧美俄罗斯乱妇| 免费看a在线观看| 亚洲美女动态图120秒| av中文字幕免费在线观看| 91久久精品一区二区| 激情综合五月网| 亚洲欧洲国产专区| 51妺嘿嘿午夜福利| 成人va在线观看| 亚洲国产午夜精品| 日本欧美一区二区| 成人黄色av片| 午夜视频精品| 亚洲人成影视在线观看| 亚洲区小说区图片区qvod| 7777精品伊久久久大香线蕉语言 | 欧美亚洲一区二区在线| 国产在线视频你懂的| 椎名由奈av一区二区三区| 免费人成又黄又爽又色| 99精品久久只有精品| 2018国产精品| 国产乱子伦视频一区二区三区 | 在线精品91av| 神宫寺奈绪一区二区三区| 欧美一区二区福利视频| 中文字幕免费观看视频| 色一区在线观看| 国产精品男女视频| 偷拍与自拍一区| 国产一级久久久| 亚洲一区二区在线观看视频 | 91社区在线观看播放| 亚洲理论在线a中文字幕| 蜜桃久久一区二区三区| 精品久久久久一区二区国产| 亚洲国产精品视频在线| 日韩欧美一区二区三区在线| 97人妻人人澡人人爽人人精品| 在线欧美日韩国产| www.久久视频| 欧美四级电影在线观看| 一级特黄aaa| 欧美日韩久久一区| 国产精品久久婷婷| 91精品国产综合久久久久| 国产精品视频一二区| 欧美精品1区2区3区| 国产一区二区三区在线观看| 欧美日韩国产小视频| 国产又粗又猛又爽又黄的视频一| 欧美日韩国产色站一区二区三区| 影音先锋国产资源| 欧美精品乱码久久久久久| av加勒比在线| 精品剧情v国产在线观看在线| 亚洲男女视频在线观看| 亚洲国产成人精品久久| 毛片在线播放网址| 中文字幕久久亚洲| 黄色免费网站在线| 欧美第一黄色网| 国产精品一二三产区| 欧美性受xxx| 国产69精品久久| 91久久国产综合久久蜜月精品| 成人爽a毛片| 美乳视频一区二区| 久久激情电影| 成人在线免费高清视频| 国产精品主播| 色播五月激情五月| 成人午夜精品在线| 蜜桃无码一区二区三区| 精品欧美一区二区三区久久久| 网友自拍亚洲| 国产在线精品自拍| 99国产精品免费网站| 精品久久久久久综合日本| 精品香蕉视频| 神马午夜伦理影院| 国产亚洲网站| 国产成人在线综合| 成人av网站在线观看| 国产肥白大熟妇bbbb视频| 国产精品国产自产拍高清av王其| 免费看一级一片| 91福利区一区二区三区| 99在线观看免费| 亚洲欧洲日产国产网站| 九七久久人人| 日韩美女视频免费看| 日韩在线观看中文字幕| 欧美凹凸一区二区三区视频 | 国产成人福利片| 自拍偷拍亚洲天堂| 一区二区三区久久| 欧美日韩 一区二区三区| 日韩精品一区二区三区在线| 男人的天堂在线| 欧美日韩成人精品| 日本综合视频| 国产乱码精品一区二区三区日韩精品| 人人狠狠综合久久亚洲婷| www.九色.com| 久久99深爱久久99精品| jizz日本免费| 亚洲最大的成人av| 中文字幕+乱码+中文字幕明步| 精品国产麻豆免费人成网站| 中国日本在线视频中文字幕| 97av在线播放| 综合视频一区| 最新精品视频| 日本最新不卡在线| 三级黄色片网站| 洋洋av久久久久久久一区| 伊人久久国产精品| 精品亚洲一区二区三区在线观看| 日韩另类在线| 91在线观看免费网站| 精品国产一区二区三区香蕉沈先生 | 天天舔天天操天天干| 精品欧美激情精品一区| 性猛交富婆╳xxx乱大交天津| 最近中文字幕2019免费| 神马久久资源| 奇米精品在线| 亚洲永久免费| 欧美日韩人妻精品一区在线| 亚洲精品免费一二三区| 国产精品久久久久久无人区| 中文字幕久久亚洲| 精品视频在线一区二区在线| 日本欧美精品久久久| 久久亚洲图片| 好吊日免费视频| 无吗不卡中文字幕| 五月婷婷丁香花| 97欧美精品一区二区三区| 成人h动漫免费观看网站| 国产一级黄色录像片| 国产美女精品一区二区三区| 四虎884aa成人精品| 7777精品伊人久久久大香线蕉 | 狠狠色噜噜狠狠狠狠97| 日本精品久久久久| 午夜精品国产精品大乳美女| 黄色欧美在线| 久久网站免费视频| 久久综合久久鬼色| 天天干天天操天天操| 国产一区二区三区四区福利| 少妇精品视频一区二区免费看| 天天综合狠狠精品| 久久99精品国产麻豆婷婷洗澡| 亚洲天堂网av在线| 欧美一区二区三区在线视频| av在线下载| 成人免费视频视频在| 亚洲区一区二| 精品少妇人妻一区二区黑料社区| 在线观看三级视频欧美| 午夜老司机在线观看| 亚洲综合色激情五月| 黄色一区二区三区四区| 538国产视频| 色哟哟日韩精品| 黄色在线论坛| 国产一级精品aaaaa看| 亚洲欧美久久| 韩国一级黄色录像| 欧美mv日韩mv国产| 亚洲天堂导航| 午夜一区二区三区| 国产精品18久久久久久久久| 日韩欧美高清在线观看| 亚洲视频第一页| 高清一区二区| 久久国产亚洲精品无码| 国产精品午夜电影| 亚洲av色香蕉一区二区三区| 欧洲精品在线视频| 97精品国产福利一区二区三区| 男人女人拔萝卜视频| 色猫猫国产区一区二在线视频| av播放在线| 国产精品播放| 蜜臀av性久久久久蜜臀av麻豆| 国产精品久久久久久久精| 日韩成人高清在线| 99久久99九九99九九九| 免费毛片小视频| 中文字幕色av一区二区三区| 天天综合网在线| 91精品国产综合久久男男| 香蕉久久国产| 精品无码人妻一区二区三| 一区二区三区动漫| 红杏视频成人|