日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
CAS下ABA問題及優(yōu)化方案

一、并發(fā)業(yè)務(wù)場景

成都創(chuàng)新互聯(lián)是一家專業(yè)提供南通企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、HTML5建站、小程序制作等業(yè)務(wù)。10年已為南通眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。

庫存業(yè)務(wù),stock(sid, num),其中:

  • sid為庫存id
  • num為庫存值

如上圖所示,兩個(gè)并發(fā)的查詢庫存操作,同時(shí)從數(shù)據(jù)庫都得到了庫存是5。

接下來用戶發(fā)生了并發(fā)的庫存扣減動(dòng)作:

如上圖所示:

  • 用戶1購買了3個(gè)庫存,于是庫存要設(shè)置為2
  • 用戶2購買了2個(gè)庫存,于是庫存要設(shè)置為3

這兩個(gè)設(shè)置庫存的接口并發(fā)執(zhí)行,庫存會(huì)先變成2,再變成3,導(dǎo)致數(shù)據(jù)不一致(實(shí)際賣出了5件商品,但庫存只扣減了2,***一次設(shè)置庫存會(huì)覆蓋和掩蓋前一次并發(fā)操作)

二、不一致原因分析

出現(xiàn)數(shù)據(jù)不一致的根本原因,是設(shè)置操作發(fā)生的時(shí)候,沒有檢查庫存與查詢出來的庫存有沒有變化,理論上:

  • 僅庫存為5的時(shí)候,用戶1的庫存設(shè)置2才能成功
  • 僅庫存為5的時(shí)候,用戶2的庫存設(shè)置3才能成功

實(shí)際執(zhí)行的時(shí)候:

  • 庫存為5,用戶1的set stock 2確實(shí)應(yīng)該成功
  • 庫存變?yōu)?了,用戶2的set stock 3應(yīng)該失敗掉

三、CAS優(yōu)化

大家常說的“Compare And Set”(CAS),是一種常見的降低讀寫鎖沖突,保證數(shù)據(jù)一致性的樂觀鎖機(jī)制。

針對上述庫存扣減的例子,CAS升級很容易,將庫存設(shè)置接口執(zhí)行的SQL:

 
 
 
 
  1. update stock set num=$num_new where sid=$sid

升級為:

 
 
 
 
  1. update stock set num=$num_new where sid=$sid and num=$num_old

即可。

四、什么是ABA問題

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

什么是ABA問題?

考慮如下操作:

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

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

庫存操作,出現(xiàn)ABA問題并不會(huì)對業(yè)務(wù)產(chǎn)生影響。

再看一個(gè)堆棧操作的例子:

并發(fā)1(上):讀取棧頂?shù)脑貫椤癆1”

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

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

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

此時(shí)會(huì)出現(xiàn)系統(tǒng)錯(cuò)誤,因?yàn)榇恕癆1”非彼“A1”

五、ABA問題的優(yōu)化

ABA問題導(dǎo)致的原因,是CAS過程中只簡單進(jìn)行了“值”的校驗(yàn),再有些情況下,“值”相同不會(huì)引入錯(cuò)誤的業(yè)務(wù)邏輯(例如庫存),有些情況下,“值”雖然相同,卻已經(jīng)不是原來的數(shù)據(jù)了。

優(yōu)化方向:CAS不能只比對“值”,還必須確保的是原來的數(shù)據(jù),才能修改成功。

常見實(shí)踐:“版本號”的比對,一個(gè)數(shù)據(jù)一個(gè)版本,版本變化,即使值相同,也不應(yīng)該修改成功。

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

(1)庫存表由

 
 
 
 
  1. stock(sid, num)

升級為

 
 
 
 
  1. stock(sid, num, version)

(2)查詢庫存時(shí)同時(shí)查詢版本號

 
 
 
 
  1. select num from stock where sid=$sid

升級為

 
 
 
 
  1. select num, version from stock where sid=$sid

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

(3)設(shè)置庫存時(shí),必須版本號相同,并且版本號要修改

舊版本“值”比對CAS

 
 
 
 
  1. update stock set num=$num_new where sid=$sid and num=$num_old

升級為“版本號”比對CAS

 
 
 
 
  1. update stock set num=$num_new, version=$version_new
  2.  where sid=$sid and version=$version_old

此時(shí)假設(shè)有并發(fā)操作,***個(gè)操作,比對版本號成功,于是把庫存和版本號都進(jìn)行了修改。

同時(shí)存在的第二個(gè)并發(fā)操作,比對版本號發(fā)生了變化,也是庫存應(yīng)該修改失敗。

六、總結(jié)

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

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


分享名稱:CAS下ABA問題及優(yōu)化方案
標(biāo)題網(wǎng)址:http://www.5511xx.com/article/dpdopco.html