国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

請教下前端APP異步并發(fā)提交訂單,如何保證賬戶余額一致性

Doogeli

問題描述

最近遇到的問題,之前沒有怎么注意,前端APP用異步提交訂單,訂單需要扣減余額,類似于快速下單秒殺的這種,用戶可能在1秒內(nèi)下單5次左右。一般的邏輯寫法是:
APP用戶提交訂單金額,邏輯處理后,查詢余額,余額>訂單金額,提交成功并扣除賬戶余額,記錄流水。

同步的時候這種情況是沒錯的,但是在異步的時候,用戶一秒內(nèi)下單5,6次,用戶余額10元,每次下單3元,
1秒5次的情況下,會導(dǎo)致余額變成負(fù)數(shù),第1次訂單余額是10元,這個時候訂單可能還沒有扣除余額,第2次就提交上來了,又是查到10元,依次的情況下,負(fù)數(shù)就出現(xiàn)了。。

請教下,如何保證前端APP異步提交的情況下,余額等賬戶情況保持一致性,不會出現(xiàn)這種金額負(fù)數(shù)的情況呢?
沒有這方面的經(jīng)驗,但接手項目,頭疼~~

1563 6 3
6個回答

軟飯工程師

使用業(yè)務(wù)鎖,上一訂單未完成,阻塞當(dāng)前訂單扣款

banro512
  1. 數(shù)據(jù)表余額字段設(shè)為 無符號int,禁止為負(fù)
  2. 修改訂單代碼,使用 事務(wù)處理,先 beginTransaction ,然后for update 查詢訂單信息鎖定。使用 Throwable 捕獲異?;貪L
  • 小W 2023-08-28

    update TABLE set yu_e = yu_e - 3 where userId= 1 and yu_e > 0;

  • Doogeli 2023-08-29

    感謝大佬指點~我學(xué)習(xí)一下。好像說可以用樂觀鎖這個概念。

MarkGo

兩方面來的吧;
後端:如果不支持餘額為負(fù)數(shù)的情況,下單->扣款->返回結(jié)果 應(yīng)當(dāng)是一個事務(wù),執(zhí)行後餘額不等於0或庫存充足的情況下才提交事務(wù);
前端:如果禁止重複下單,下單後按鈕disable,有結(jié)果後才enable?;蛘咄ㄟ^節(jié)流防抖那套方案。

  • gddd 2023-08-28

    正解,如果要防止數(shù)據(jù)庫壓力過大,可以執(zhí)行 數(shù)據(jù)庫事務(wù)之前,加上redis鎖,就最簡單的那種就行了,事務(wù)提交成功了刪除key,不然再下單,就直接返回失敗

  • Doogeli 2023-08-29

    感謝大佬指點~主要是秒殺類,按鈕如果disable用戶體驗就差了。項目意思不加這個。感謝大佬們~

  • Doogeli 2023-08-29

    可以執(zhí)行 數(shù)據(jù)庫事務(wù)之前,加上redis鎖,用戶的錢包余額,沒地進(jìn)redis的,因為需要實時更新這塊,我直接都是從數(shù)據(jù)庫里面實時取出來的。如果redis如何保證用戶的余額與redis里面的是一致的?

  • MarkGo 2023-08-30

    “按鈕如果disable用戶體驗就差了”;其實看你怎樣設(shè)計,如提交時異步的,disable按鈕後害怕體驗差,那就加上搶購中的動畫效果;但始終需要分開,前端的disable是為了防止重複提交對後端產(chǎn)生額外的性能開銷和流量開銷,並不是為了防止重單;重單的應(yīng)該後端事務(wù)控制;而如果你是搶購類的,其實還不如預(yù)熱的時候把數(shù)據(jù)丟入redis,redis進(jìn)行庫存控制,數(shù)據(jù)延遲入庫,這樣就能避免數(shù)據(jù)庫壓力

  • Doogeli 2023-08-31

    感謝大佬的回答,學(xué)習(xí)了~確實是應(yīng)該丟入redis,處理起來會更好一點

adobe

數(shù)據(jù)庫事務(wù)里加鎖查詢 或使用redis鎖實現(xiàn)

  • Doogeli 2023-08-29

    謝謝大佬。~

  • Doogeli 2023-08-29

    那就是要把用戶的余額這些都放在redis里面,然后每次請求同步redis數(shù)據(jù)嗎?先請求redis,業(yè)務(wù)鎖,然后去數(shù)據(jù)庫查詢余額,判斷此時余額是否達(dá)到訂單創(chuàng)建的標(biāo)準(zhǔn),就放行,同步redis數(shù)據(jù)。

  • adobe 2023-08-30

    余額是實時的,不建議存在redis里,余額存在數(shù)據(jù)庫里,只是并發(fā)可以使用redis鎖來解決,誰拿到鎖,誰先鎖定余額

  • Doogeli 2023-08-31

    等我測試下效果先。感謝大佬,學(xué)習(xí)了

qq7467466

這個插件非常適合你,支持文件鎖,redis鎖等各種

http://www.wtbis.cn/plugin/56

  • 小W 2023-08-29

    直接使用setnx就行吧,關(guān)鍵是數(shù)據(jù)庫的壓力

  • Doogeli 2023-08-29

    感稿大佬~

army

我用cache鎖,收到請求前先判斷緩存標(biāo)記是否存在->沒有就添加緩存標(biāo)記/有標(biāo)記就阻斷業(yè)務(wù)->再處理業(yè)務(wù)->處理完再刪除緩存標(biāo)記

  • Doogeli 2023-08-31

    因為有些需要實時的效果,緩存不太適合現(xiàn)在的場景,感謝大佬的回答~學(xué) 習(xí)了

年代過于久遠(yuǎn),無法發(fā)表回答
??