成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

巧用CAS解決數據一致性問題

開發 開發工具
在高并發的分布式環境下,對于數據的查詢與修改容易引發一致性問題,本文將分享一種非常簡單但有效的優化方法。

[[177350]]

在高并發的分布式環境下,對于數據的查詢與修改容易引發一致性問題,本文將分享一種非常簡單但有效的優化方法。

一、業務場景

業務場景為,購買商品的過程要對余額進行查詢與修改,大致的業務流程如下:

(1)從數據庫查詢用戶現有余額 SELECT money FROM t_yue WHERE uid=$uid,不妨設查詢出來的$old_money=100元

從數據庫查詢用戶現有余額

(2)業務層實施業務邏輯,比如購買一個80元的商品,并且打九折

if($old_money> 80*0.9) $new_money=$old_money-80*0.9=28

業務層實施業務邏輯

(3)將數據庫中的余額進行修改 UPDAtE t_yue SET money=$new_money WHERE uid=$uid

將數據庫中的余額進行修改

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

二、潛在的問題

在分布式環境中,如果并發量很大,這種“查詢+修改”的業務很容易出現數據不一***限情況下,可能出現這樣的異常流程:

(1)業務1和業務2同時查詢余額,是100元

高并發的分布式環境下,可能出現的異常流程

(2)業務1和業務2進行邏輯計算,算出各自業務的余額,假設業務1算出的余額是28元,業務2算出的余額是38元

高并發的分布式環境下,可能出現的異常流程

(3)業務1對數據庫中的余額先進行修改,設置成28元。

業務2對數據庫中的余額后進行修改,設置成38元。

高并發的分布式環境下,可能出現的異常流程

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

三、問題原因

高并發環境下,對同一個數據的并發讀(兩邊都讀出余額是100)與并發寫(一個寫回28,一個寫回38)導致的數據一致性問題。

四、原因分析

業務1的寫回:原有金額100,這是一個初始狀態,寫回金額28,理論上只有在原有金額為100的時候才允許寫回成功,這一步沒問題。

業務2的寫回:的原有金額100,這是一個初始狀態,寫回金額38,理論上只有在原有金額為100的時候才允許寫回成功,可實際上,這個時候數據庫中的金額已經變為28了,這一步的寫操作不應該成功。

五、簡易解決方案

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

六、業務的升級

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

對于上文中的業務場景,只需要將“UPDAtEt_yue SET money=$new_money WHERE uid=$uid”升級為

“UPDAtE t_yue SETmoney=$new_money WHERE uid=$uid AND money=$old_money”即可。

并發操作發生時:

業務1執行 => UPDAtE t_yue SET money=28 WHERE uid=$uid AND money=100

業務2執行 => 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的時候,加上初始條件的比對。

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

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

2023-08-01 07:42:33

Redis數據項目

2022-06-21 21:47:13

數據系統

2012-09-24 09:35:42

分布式系統

2019-05-27 09:00:00

蘇寧智慧零售平臺數據庫

2022-05-31 08:37:59

RedisMySQL數據一致性

2024-04-11 13:45:14

Redis數據庫緩存

2022-09-06 15:30:20

緩存一致性

2024-11-14 07:10:00

2022-08-11 07:55:05

數據庫Mysql

2018-10-25 14:40:23

分布式數據數據不一致

2024-12-26 15:01:29

2023-09-07 08:11:24

Redis管道機制

2025-03-27 08:20:54

2020-09-04 06:32:08

緩存數據庫接口

2025-06-16 02:11:00

2023-06-29 08:00:59

redis數據MySQL

2021-12-05 21:06:27

軟件

2021-10-18 10:30:59

流計算阿里云

2009-06-18 09:18:08

Oracle檢索數據數據一致性事務恢復

2024-08-20 16:13:52

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩精品视频在线观看一区二区三区 | 亚洲精品一区二区三区中文字幕 | 欧美电影大全 | 黄色一级特级片 | 国内精品免费久久久久软件老师 | 久久久久久免费毛片精品 | 欧美黄在线观看 | 久久亚洲美女 | 操人网站| 精品在线视频播放 | 亚洲午夜精品一区二区三区他趣 | 高清欧美性猛交xxxx黑人猛交 | 久久久久久成人 | 亚洲aⅴ| 久久久国产一区二区三区 | 欧美日日 | 国产综合第一页 | www.激情.com| 欧美成人高清 | 免费在线观看成年人视频 | 久热爱 | 成人高清在线 | 亚洲va欧美va人人爽午夜 | 一级黄色网页 | 一区二区三区视频 | 高清国产一区二区 | 欧美一区二区三区在线播放 | 手机看片在线播放 | 在线观看中文字幕av | 国产美女永久免费无遮挡 | 午夜免费视频 | 高清一区二区三区 | 午夜电影网站 | 午夜小电影 | 欧美在线观看一区 | 国产精品久久久久久久一区二区 | 免费一看一级毛片 | 日本电影免费完整观看 | 精品欧美一区二区在线观看欧美熟 | 一级片在线视频 | 精品国产一区二区三区久久狼黑人 |