創(chuàng)建訂單和更新訂單的數(shù)據(jù)一致性問題
來源: 程序員客棧 2023-02-28 23:52:37
大家好,我是Leo。
(資料圖片)
聊一下創(chuàng)建訂單和更新訂單的數(shù)據(jù)一致性問題,文章分類主要是MySQL,Redis,秒殺系統(tǒng),RocketMQ,計算機(jī)網(wǎng)絡(luò),大廠面試,設(shè)計模式,Nginx。先整理一下。方便粉絲更好的閱讀,同時也方便自己不斷的復(fù)習(xí)沉淀。
重復(fù)下單我們在下單時,往往會因為網(wǎng)絡(luò)問題出現(xiàn)多次下單的情況,比如點了下單一直沒反應(yīng),我們就會多次的重復(fù)點擊,如果服務(wù)端做了校驗可能不會出現(xiàn)什么問題,如果沒做的話在訂單列表里可能就會出現(xiàn)多個訂單。
解決方案就是我們可以對訂單實現(xiàn)具備冪等性。
冪等性就是無論點擊多少次下單,始終只會創(chuàng)建一條記錄。
如果系統(tǒng)體量比較大的話,我們可以獨立一個生成訂單號服務(wù),體量不大的話可以封裝成一個API給訂單服務(wù)使用。
當(dāng)用戶從購物車界面點結(jié)算挑戰(zhàn)到訂單詳情界面就請求一次生成訂單號,使這個訂單詳情頁的緩存中保存一條唯一的訂單號
只要每次下單請求的訂單號是唯一的,我們再借助數(shù)據(jù)庫中主鍵唯一約束性來實現(xiàn),訂單數(shù)據(jù)的唯一性。
ABA問題如果主鍵是訂單號的話,主鍵自動幫我們實現(xiàn)了。如果主鍵是時間戳ID的話,我們把訂單號字段設(shè)為唯一索引,同時也可以避免重復(fù)下單的校驗需求。
訂單服務(wù)會經(jīng)常出現(xiàn)ABA問題。
什么是 ABA 問題呢?我們舉個例子,訂單支付之后,小二要發(fā)貨,發(fā)貨完成后要填個快遞單號。假如小二填了一個單號 666,剛填完,發(fā)現(xiàn)填錯了,趕緊再修改成 888。對訂單服務(wù)來說,這就是 2 個更新訂單的請求。
正常情況下,訂單中的快遞單號會先更新成 666,再更新成 888,這是沒問題的。那不正常情況呢?666 請求到了,單號更新成 666,然后 888 請求到了,單號又更新成 888,但是 666 更新成功的響應(yīng)丟了,調(diào)用方?jīng)]收到成功響應(yīng),自動重試,再次發(fā)起 666 請求,單號又被更新成 666 了,這數(shù)據(jù)顯然就錯了。這就是ABA 問題。
解決方案就是我們在訂單表中加一個版本號這個字段。
在查詢訂單時,我們可以把版本號返回給前端,前端在處理下單時,以參數(shù)的形式傳遞給后端,后端收到版本號之后與數(shù)據(jù)庫的實際數(shù)據(jù)對比,如果版本號符合,修改數(shù)據(jù),版本號遞增。
為了考慮數(shù)據(jù)安全性,我們一般會將 校驗版本號,修改數(shù)據(jù),修改版本號在一個事務(wù)中執(zhí)行
UPDATE orders set tracking_number = 666, version = version + 1WHERE version = 8;
通過版本號,我們就可以得知,在每次修改數(shù)據(jù)時,是否有其他人修改過。這樣就不會出現(xiàn)ABA問題了。
標(biāo)簽: 數(shù)據(jù)一致性 解決方案 快遞單號
猜你喜歡

創(chuàng)建訂單和更新訂單的數(shù)據(jù)一致性問題
2023-02-28 23:52:37

剛點完痣吃什么食物對恢復(fù)好_點完痣后吃什么恢復(fù)快 天天速看
2023-02-28 21:07:31

Limita_當(dāng)前聚焦
2023-02-28 20:54:49

全球資訊:報告:全球四成首席高管將氣候變化列為企業(yè)應(yīng)對的“首要問題”
2023-02-28 18:43:39

當(dāng)前資訊!稅收政策助力鄉(xiāng)村致富——記黎平縣鄉(xiāng)村致富帶頭人吳國邦
2023-02-28 16:15:05

手機(jī)分期平臺哪個最好_手機(jī)分期
2023-02-28 15:26:22

宏聯(lián)國際否認(rèn)與“大嘴猴”品牌解約 相關(guān)業(yè)務(wù)正常有序開展
2023-02-28 14:21:34

本地連接在什么位置?本地連接怎樣進(jìn)行設(shè)置?本地連接的相關(guān)介紹
2023-02-28 13:58:17

什么是IPX協(xié)議?ipx協(xié)議安裝教程
2023-02-28 13:57:52

系統(tǒng)分區(qū)是什么意思?win10系統(tǒng)分區(qū)怎樣進(jìn)行操作?
2023-02-28 13:57:21

花刺代理是什么?花刺代理怎么使用?
2023-02-28 13:56:54

DVD解碼器如何安裝?DVD解碼器具體的安裝步驟
2023-02-28 13:53:08

蘋果開機(jī)一直在開機(jī)畫面怎么處理?怎么將蘋果的界面主色調(diào)恢復(fù)成正常顏色?
2023-02-28 13:52:45

自動點擊器怎么使用?自動點擊器怎么設(shè)置參數(shù)?
2023-02-28 13:52:24

iphone固件不兼容的原因是什么?蘋果固件不兼容怎么辦?
2023-02-28 13:49:36

提示sd卡已受損是什么原因?修復(fù)已損壞的手機(jī)SD卡方法
2023-02-28 13:48:55

MSN帳號格式是什么?MSN用戶名格式的詳細(xì)介紹
2023-02-28 13:48:36

尼康D300說明書是什么?尼康D300相機(jī)詳細(xì)參數(shù)
2023-02-28 13:45:43

mp4和mp5的區(qū)別在哪?mp4和mov格式區(qū)別對比
2023-02-28 13:45:21

繁體字轉(zhuǎn)換非主流怎么轉(zhuǎn)?非主流繁體字轉(zhuǎn)換器工具轉(zhuǎn)換方法
2023-02-28 13:44:53

麥克風(fēng)沒聲音是什么原因?麥克風(fēng)沒聲音具體解決方法
2023-02-28 13:40:47

下劃線在鍵盤上怎么打?下劃線快捷鍵ctrl加什么?
2023-02-28 13:40:00

UDP端口要如何打開?UDP端口具體打開的方法步驟
2023-02-28 13:39:31

office2010免費密鑰怎么找?office2010激活密鑰分享及激活碼使用步驟
2023-02-28 13:37:27

imax和3d的區(qū)別在哪?imax影院和普通影院有什么區(qū)別?
2023-02-28 13:37:04