国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

并發扣款,如何保證數據的一致性?

開發 開發工具 前端
沈老師,我們有個業務,同一個用戶在并發“查詢,邏輯計算,扣款”的情況下,余額可能出現不一致,請問有什么優化方法么?

繼續解答星球水友提問。

沈老師,我們有個業務,同一個用戶在并發“查詢,邏輯計算,扣款”的情況下,余額可能出現不一致,請問有什么優化方法么?

扣款的業務場景是怎樣的?

用戶購買商品的過程中,要對余額進行查詢與修改,大致的業務流程如下:第一步,從數據庫查詢用戶現有余額:

  1. SELECT money FROM t_yue WHERE uid=$uid; 

不妨設查詢出來的$old_money=100元。

第二步,業務層實施業務邏輯計算,比如:

  • 先查詢購買商品的價格,例如是80元;
  • 再查詢產品是否有活動,以及活動折扣,例如是9折;
  • 比對余額是否足夠,足夠時才往下走;
  1. if($old_money> 80*0.9){ 
  2.     $new_money=$old_money-80*0.9=28 
  3. } else { 
  4.     return "Not enough minerals"; 

第三步,將數據庫中的余額進行修改。

  1. UPDATE t_yue SET money=$new_money WHERE uid=$uid; 

在并發量低的情況下,這個流程沒有任何問題,原有金額100元,購買了80元的九折商品(72元),剩余28元。

同一個用戶,并發扣款可能出現什么問題?

在分布式環境中,如果并發量很大,這種“查詢+修改”的業務有一定概率出現數據不一致。

極限情況下,可能出現這樣的異常流程:

步驟一,業務1和業務2并發查詢余額,是100元。

畫外音:這些并發查詢,是在不同的站點實例/服務實例上完成的,進程內互斥鎖肯定解決不了。

步驟二,業務1和業務2并發進行邏輯計算,算出各自業務的余額,假設業務1算出的余額是28元,業務2算出的余額是38元。

步驟三,業務1對數據庫中的余額先進行修改,設置成28元。業務2對數據庫中的余額后進行修改,設置成38元。

此時異常出現了,原有金額100元,業務1扣除了72元,業務2扣除了62元,最后剩余38元。

畫外音:假設業務1先寫回余額,業務2再寫回余額。

常見的解決方案?

對于此案例,同一個用戶,并發扣款時,有小概率會出現異常,可以對每一個用戶進行分布式鎖互斥,例如:在redis/zk里搶到一個key才能繼續操作,否則禁止操作。

這種悲觀鎖方案確實可行,但要引入額外的組件(redis/zk),并且會降低吞吐量。

對于小概率的不一致,有沒有樂觀鎖的方案呢?

對并發扣款進行進一步的分析發現:

(1) 業務1寫回時,舊余額100,這是一個初始狀態;新余額28,這是一個結束狀態。理論上只有在舊余額為100時,新余額才應該寫回成功。

而業務1并發寫回時,舊余額確實是100,理應寫回成功。

(2) 業務2寫回時,舊余額100,這是一個初始狀態;新余額28,這是一個結束狀態。理論上只有在舊余額為100時,新余額才應該寫回成功。

可實際上,這個時候數據庫中的金額已經變為28了,所以業務2的并發寫回,不應該成功。

如何低成本實施樂觀鎖?

在set寫回的時候,加上初始狀態的條件compare,只有初始狀態不變時,才允許set寫回成功,Compare And Set(CAS),是一種常見的降低讀寫鎖沖突,保證數據一致性的方法。

此時業務要怎么改?

使用CAS解決高并發時數據一致性問題,只需要在進行set操作時,compare初始值,如果初始值變換,不允許set成功。

具體到這個case,只需要將:

  1. UPDATE t_yue SET money=$new_money WHERE uid=$uid; 
  2. 升級為: 
  3. UPDATE t_yue SET money=$new_money WHERE uid=$uid AND money=$old_money; 

即可。

并發操作發生時:業務1執行:

  1. UPDATE t_yue SET money=28 WHERE uid=$uid AND money=100

業務2執行:

  1. UPDATE t_yue SET money=38 WHERE uid=$uid AND money=100

這兩個操作同時進行時,只可能有一個執行成功。

怎么判斷哪個并發執行成功,哪個并發執行失敗呢?

set操作,其實無所謂成功或者失敗,業務能通過affect rows來判斷:

  • 寫回成功的,affect rows為1
  • 寫回失敗的,affect rows為0

總結

高并發“查詢并修改”的場景,可以用CAS(Compare and Set)的方式解決數據一致性問題。對應到業務,即在set的時候,加上初始條件的比對即可。

優化不難,只改了半行SQL,但確實能解決問題。

但希望大家有收獲,思路比結論重要。

【本文為51CTO專欄作者“58沈劍”原創稿件,轉載請聯系原作者】

戳這里,看該作者更多好文

 

責任編輯:趙寧寧 來源: 架構師之路
相關推薦

2022-10-19 12:22:53

并發扣款一致性

2024-01-10 08:01:55

高并發場景悲觀鎖

2025-03-27 08:20:54

2024-12-26 15:01:29

2023-09-07 08:11:24

Redis管道機制

2021-03-04 06:49:53

RocketMQ事務

2020-08-05 08:46:10

NFS網絡文件系統

2024-08-20 16:13:52

2023-05-26 07:34:50

RedisMySQL緩存

2021-12-14 07:15:57

MySQLRedis數據

2024-10-16 09:53:07

2022-03-29 10:39:10

緩存數據庫數據

2024-10-28 12:41:25

2023-12-11 12:27:31

并發Zookeeper數據

2022-04-06 15:19:32

數據庫MySQL一致性

2024-01-22 08:52:00

AQS雙異步數據一致性

2019-09-08 22:45:48

并發扣款一致性冪等性

2024-07-04 12:36:50

2020-04-01 15:50:17

TiDBMySQL數據庫

2020-06-01 22:09:48

緩存緩存同步緩存誤用
點贊
收藏

51CTO技術棧公眾號

亚洲va欧美va在线观看| 蜜桃一区二区三区四区| 日韩美香港a一级毛片| 精品人妻人人做人人爽| 91精品视频专区| 性高湖久久久久久久久aaaaa| 精品久久久久久久无码| 国语自产偷拍精品视频偷| 色中色在线视频| 国产午夜精品免费一区二区三区 | 国产精品99一区二区| 欧美日韩久久一区| 福利h视频在线| 午夜一区二区三区视频| 97涩在线观看视频| 男男gay无套免费视频欧美| 7777精品伊人久久久大香线蕉完整版 | 精品国产乱码久久久久久夜甘婷婷| av福利导福航大全在线播放| 国产韩国精品一区二区三区| 国模叶桐国产精品一区| 3d欧美精品动漫xxxx无尽| 国产精品精品久久久久久| 日韩城人网站| 色悠悠久久88| 成人午夜888| 欧美国产中文字幕| 亚洲精品影院| 99热免费精品在线观看| 国产精品加勒比| 欧美精品激情| 国产精品久久九九| 国产农村妇女精品一二区| 久久99九九| 久久精品卡一| 中文字幕欧美人与畜| 国产综合色精品一区二区三区| 一区二区精品国产| 国产精品18久久久久久久网站| 亚洲欧美一二三| 久久精品国产久精国产| 综合操久久久| 99国产精品国产精品毛片| 九九热在线免费| 亚洲免费观看高清完整版在线| 日韩男人天堂| 欧美午夜影院在线视频| eeuss影院www在线观看| 欧美一区二区日韩一区二区| 国产不卡人人| 欧美成人一二三| 欧美少妇性xxxx| 好看的日韩精品视频在线| 精品在线观看视频| 国产精品人人妻人人爽人人牛| 亚洲精品日日夜夜| 成年人在线观看| 日韩精品高清视频| 久久香蕉精品香蕉| 成人在线一区二区| 视频在线观看国产精品| 黄色一级片av| 亚洲欧美日韩久久| 久草免费在线| 插插插亚洲综合网| 91高清一区| 9色视频在线观看| 亚洲六月丁香色婷婷综合久久| 午夜视频成人| 中文字幕欧美日韩| 9999国产精品| av在线免费观看国产| 亚洲午夜一二三区视频| 丝袜国产在线| 日韩av电影手机在线| 日本伊人午夜精品| eeuss在线播放| 亚洲成人免费网站| 国产精品一区二区三区av麻| 亚洲高清在线观看一区| 亚洲同性同志一二三专区| 在线三级中文| 国产精品国产自产拍高清av| 亚洲欧美日韩精品综合在线观看| 26uuu国产在线精品一区二区| 色视频在线观看福利| 精品亚洲va在线va天堂资源站| 亚洲免费专区| 精品国产三级a∨在线| 精品二区三区线观看| 亚洲欧洲日本精品| 欧美美女黄视频| y111111国产精品久久久| 亚洲精品国精品久久99热一| 风间由美一区二区av101| 精品无码久久久久久久动漫| 国产日本欧洲亚洲| 91禁在线看| 91久久久国产精品| 日本一区二区三区四区在线视频| av片在线观看免费| 国产精品69av| 成人久久久精品乱码一区二区三区| 青青草免费在线| 久久久久久久久久久av| 国产一区二区不卡在线| 国际av在线| 欧美在线一区二区三区四| 国产91精品精华液一区二区三区| 一区二区高清不卡| 国产脚交av在线一区二区| 成人教育av在线| 丝袜在线观看| 国产一区二区三区免费不卡| 一区二区视频在线| 国产成人一二片| 日本一道本久久| 亚洲欧美国产高清va在线播| 亚洲人成久久| 欧美成人明星100排名| 欧美大片在线看| 成人99免费视频| 日韩免费电影| 一区二区三区av| 制服视频三区第一页精品| 亚洲第一偷拍| 在线播放你懂得| 国产成人精品一区| 中文字幕在线观看不卡| 四虎精品在线观看| 毛片在线视频播放| 中文字幕欧美国内| caoporm超碰国产精品| 国产视频一视频二| 亚洲男人7777| 激情久久久久久久久久久久久久久久| 9色在线视频| 国产精品一区二区三区在线| 色综合色狠狠天天综合色| 围产精品久久久久久久| 亚洲热app| 91香蕉嫩草影院入口| 亚洲午夜一区二区| 不卡在线一区| 成年人免费看的视频| 欧美在线亚洲在线| 亚洲一区二区三区中文字幕| 第一社区sis001原创亚洲| 亚洲成人男人天堂| 风间由美久久久| 日韩精品一区二区三区中文不卡| 日本成人在线不卡视频| 欧美日韩大片| 国产激情在线观看视频| 欧美亚洲一区在线| 高清毛片在线看| 国产精品人人做人人爽人人添| 成人噜噜噜噜| 亚洲第一狼人区| 国产高清视频一区三区| 欧美午夜视频在线观看| 国产精品久久久免费| 欧美激情护士| 日本久久精品一区二区| 国产精品高潮粉嫩av| 欧美日韩在线直播| 国产精品综合二区| 激情视频极品美女日韩| 中文字幕乱在线伦视频乱在线伦视频| 99久热re在线精品996热视频| 91麻豆精品国产91久久久资源速度| 美国欧美日韩国产在线播放| 992tv国产精品成人影院| 日日干夜夜操s8| 91综合免费在线| 亚洲的天堂在线中文字幕| 91网站最新网址| 欧美色图在线播放| wwwav在线| aa在线免费观看| 国产欧美一区二区三区视频| 日韩欧美视频在线| 久久久美女毛片| 国产精品多人| 青草综合视频| 欧美激情图区| 亚洲成人自拍| 欧美肥臀大乳一区二区免费视频| 偷拍一区二区三区四区| 青草国产精品久久久久久| 久久精品论坛| 呦呦在线视频| 羞羞小视频视频| 欧美日韩精品免费看| 午夜精品国产精品大乳美女| 欧美精品亚洲一区二区在线播放| 久久一区二区三区四区| 川上优的av在线一区二区| 欧美一级爱爱视频| 国产精品三级在线|