日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網營銷解決方案
并發(fā)扣款一致性優(yōu)化,CAS下ABA問題,這個話題還沒聊完?。?!

上一篇答星球水友提問,《并發(fā)扣款,如何保證數據的一致性?》中提到:用CAS樂觀鎖,可以在盡量不影響吞吐量的情況下,保證數據的一致性。

大家有非常多的留言,大概有這么幾類:

  • 是否存在ABA問題?
  • 為什么不能用:
  •   
      
      
      
    1. UPDATE t_yue SET moneymoney=money-$diff AND money>=$diff;
  • 能否借助redis事務來扣減余額;

畫外音:請務必閱讀前序文章:《并發(fā)扣款,如何保證數據的一致性?》。

問題比較多,今天先聊第一個問題,ABA。

什么是ABA問題?

CAS樂觀鎖機制確實能夠提升吞吐,并保證一致性,但在極端情況下可能會出現(xiàn)ABA問題。

考慮如下操作:

  • 并發(fā)1(上):獲取出數據的初始值是A,后續(xù)計劃實施CAS樂觀鎖,期望數據仍是A的時候,修改才能成功
  • 并發(fā)2:將數據修改成B
  • 并發(fā)3:將數據修改回A
  • 并發(fā)1(下):CAS樂觀鎖,檢測發(fā)現(xiàn)初始值還是A,進行數據修改

上述并發(fā)環(huán)境下,并發(fā)1在修改數據時,雖然還是A,但已經不是初始條件的A了,中間發(fā)生了A變B,B又變A的變化,此A已經非彼A,數據卻成功修改,可能導致錯誤,這就是CAS引發(fā)的所謂的ABA問題。

余額操作,出現(xiàn)ABA問題并不會對業(yè)務產生影響,因為對于“余額”屬性來說,前一個A為100余額,與后一個A為100余額,本質是相同的。

但其他場景未必是這樣,舉一個堆棧操作的例子:

并發(fā)1(上):讀取棧頂的元素為“A1”

并發(fā)2:進行了2次出棧

并發(fā)3:又進行了1次出棧

并發(fā)1(下):實施CAS樂觀鎖,發(fā)現(xiàn)棧頂還是“A1”,于是修改為A2

此時會出現(xiàn)系統(tǒng)錯誤,因為此“A1”非彼“A1”

ABA問題可以怎么優(yōu)化?

ABA問題導致的原因,是CAS過程中只簡單進行了“值”的校驗,再有些情況下,“值”相同不會引入錯誤的業(yè)務邏輯(例如余額),有些情況下,“值”雖然相同,卻已經不是原來的數據了(例如堆棧)。

因此,CAS不能只比對“值”,還必須確保是原來的數據,才能修改成功。

常見的實踐是,將“值”比對,升級為“版本號”的比對,一個數據一個版本,版本變化,即使值相同,也不應該修改成功。

余額并發(fā)讀寫例子,引入版本號的具體實踐如下:

(1)余額表要升級。

 
 
 
 
  1. t_yue(uid, money)

升級為:

 
 
 
 
  1. t_yue(uid, money, version)

(2)查詢余額時,同時查詢版本號。

 
 
 
 
  1. SELECT money FROM t_yue WHERE sid=$sid

升級為:

 
 
 
 
  1. SELECT money,version FROM t_yue WHERE sid=$sid

假設有并發(fā)操作,都會將版本號查詢出來。

(3)設置余額時,必須版本號相同,并且版本號要修改。舊版本“值”比對:

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

升級為“版本號”比對:

 
 
 
 
  1. UPDATE t_yue SET money=38, version=$version_new WHERE uid=$uid AND version=$version_old

此時假設有并發(fā)操作,首先操作的請求會修改版本號,并發(fā)操作會執(zhí)行失敗。

畫外音:version通用,本例是強行用version舉例而已,實際上本例可以用余額“值”比對。

總結

  • select&set業(yè)務場景,在并發(fā)時會出現(xiàn)一致性問題
  • 基于“值”的CAS樂觀鎖,可能導致ABA問題
  • CAS樂觀鎖,必須保證修改時的“此數據”就是“彼數據”,應該由“值”比對,優(yōu)化為“版本號”比對

思路比結論重要。

【本文為專欄作者“58沈劍”原創(chuàng)稿件,轉載請聯(lián)系原作者】


文章標題:并發(fā)扣款一致性優(yōu)化,CAS下ABA問題,這個話題還沒聊完?。?!
URL地址:http://www.dlmjj.cn/article/cddepei.html