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

CAS下ABA問(wèn)題及優(yōu)化方案

開發(fā) 開發(fā)工具
CAS樂(lè)觀鎖機(jī)制確實(shí)能夠提升吞吐,并保證一致性,但在極端情況下可能會(huì)出現(xiàn)ABA問(wèn)題。下面,我們就一起探討CAS下ABA問(wèn)題及優(yōu)化方案。

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

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

  • sid為庫(kù)存id
  • num為庫(kù)存值

庫(kù)存業(yè)務(wù)

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

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

并發(fā)的庫(kù)存扣減動(dòng)作

如上圖所示:

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

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

二、不一致原因分析

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

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

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

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

三、CAS優(yōu)化

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

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

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

升級(jí)為:

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

即可。

四、什么是ABA問(wèn)題

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

什么是ABA問(wèn)題?

考慮如下操作:

  • 并發(fā)1(上):獲取出數(shù)據(jù)的初始值是A,后續(xù)計(jì)劃實(shí)施CAS樂(lè)觀鎖,期望數(shù)據(jù)仍是A的時(shí)候,修改才能成功
  • 并發(fā)2:將數(shù)據(jù)修改成B
  • 并發(fā)3:將數(shù)據(jù)修改回A
  • 并發(fā)1(下):CAS樂(lè)觀鎖,檢測(cè)發(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問(wèn)題。

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

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

堆棧操作的例子

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

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

并發(fā)

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

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

并發(fā)

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

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

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

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

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

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

(1)庫(kù)存表由

  1. stock(sid, num) 

升級(jí)為

  1. stock(sid, num, version) 

(2)查詢庫(kù)存時(shí)同時(shí)查詢版本號(hào)

  1. select num from stock where sid=$sid 

升級(jí)為

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

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

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

舊版本“值”比對(duì)CAS

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

升級(jí)為“版本號(hào)”比對(duì)CAS

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

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

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

六、總結(jié)

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

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

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

責(zé)任編輯:趙寧寧 來(lái)源: 51CTO專欄
相關(guān)推薦

2021-03-03 07:53:23

CAScompare andABA問(wèn)題

2019-09-05 08:54:38

一致性CASABA

2023-11-12 11:56:28

Json格式弊端

2010-06-21 14:58:35

AODV路由協(xié)議

2021-05-18 08:21:38

React HooksReact前端

2011-08-11 11:06:20

SSAS多維數(shù)據(jù)庫(kù)數(shù)據(jù)倉(cāng)庫(kù)

2024-11-19 17:54:15

JavaCASABA問(wèn)題

2009-02-20 11:05:58

PHP優(yōu)化高效提速

2021-02-02 18:02:09

java對(duì)象數(shù)據(jù)

2021-02-08 21:07:47

JavaCAS機(jī)制

2009-06-18 10:24:00

CDMA網(wǎng)絡(luò)優(yōu)化

2015-05-12 16:31:22

Elasticsear開源分布式搜索引擎

2010-09-26 15:38:33

JVM內(nèi)存泄漏

2019-10-08 16:05:19

Redis數(shù)據(jù)庫(kù)系統(tǒng)

2020-01-16 14:59:32

Java鎖優(yōu)化CAS

2018-11-14 14:18:26

APP網(wǎng)絡(luò)分析

2020-09-27 10:35:22

Vue前端代碼

2010-06-12 12:46:04

Grub Rescue

2022-09-09 15:58:29

HiveServerHive 組件Java 開發(fā)

2010-08-13 09:01:39

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 91久久综合 | 欧美午夜影院 | 韩三级在线观看 | 男女网站免费 | 户外露出一区二区三区 | 夜夜av | 99久久国产免费 | 久久久久久久久久久久久久av | 国产一级在线 | 九九免费视频 | 一区二区视频 | 亚洲天堂二区 | 欧美亚洲视频在线观看 | 一区二区在线免费观看视频 | 天天干天天干 | 国产色| 久久人人爽人人爽 | 精品伊人久久 | se婷婷 | 久久久女女女女999久久 | 欧美福利影院 | www日日日 | 欧美日韩国产精品激情在线播放 | 久久久久久蜜桃一区二区 | 亚洲一区免费 | 四虎影院免费在线 | 欧美日韩不卡合集视频 | 国产精品资源在线观看 | 午夜影院 | 国产高清精品网站 | 欧美h视频| 少妇久久久| 亚洲在线一区 | 91久久精品日日躁夜夜躁国产 | 欧美最猛黑人xxxx黑人 | 男人午夜视频 | 99精品在线观看 | 在线欧美小视频 | 黄色片大全在线观看 | 日本在线免费 | 亚洲 欧美 日韩在线 |