91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

并發(fā)場(chǎng)景下如何保證數(shù)據(jù)操作的準(zhǔn)確性?

jf_ro2CN3Fa ? 來(lái)源:juejin.cn ? 2023-07-09 16:02 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

  • Part One
  • Part Two


Part One

我們假想一個(gè)場(chǎng)景,在并發(fā)場(chǎng)景下,假如要對(duì)賬戶余額(tb_balance.balance)進(jìn)行增加和減少余額,要怎么設(shè)計(jì)才能保證數(shù)據(jù)不出錯(cuò)呢?

下面是我的一些設(shè)想(假設(shè)余額更新20或減少20):

直接sql更新

直接balance自增20,怎么并發(fā)都余額都不會(huì)錯(cuò)了是不是~,但這里會(huì)有問(wèn)題,1.假如是減余額的話,要注意余額不能小于0 2.假如后續(xù)需要用這個(gè)余額結(jié)果再進(jìn)行一些業(yè)務(wù)操作的話,是取不到這個(gè)余額的sql

updatetb_balancesetbalance=balance+20wherebalance=#{old_bal}anduser_id=#{user_id}

CAS

經(jīng)典的compare and swap,就是入庫(kù)時(shí)去對(duì)比舊值是否與現(xiàn)數(shù)據(jù)庫(kù)中的值相等,若相等則更新否則不更新,但是會(huì)有風(fēng)險(xiǎn),就是經(jīng)典的aba問(wèn)題。假如更新返回的影響數(shù)為0的話,說(shuō)明余額已經(jīng)發(fā)生了變化,所以需要拋出異常并進(jìn)行重試。(這里需要寫一些補(bǔ)償?shù)臉I(yè)務(wù)邏輯去處理余額更新失敗的問(wèn)題)

/**
*用戶余額增加20
*newBal為新值
*oldBal為庫(kù)中查出的值
**/
oldBal=balService.getBal(userId);
newBal=oldBal+20;

intcount=balService.updateBal(newBal,oldBal,userId);
Assert.businessInvalid(count==0,"updateerror");

//todosomebuisness
updatetb_balancesetbalance=#{new_bal}wherebalance=#{old_bal}anduser_id=#{user_id}

樂(lè)觀鎖

樂(lè)觀鎖其實(shí)就是使用version去進(jìn)行版本控制,在更新時(shí)判斷是否更新數(shù)據(jù)的版本與現(xiàn)庫(kù)內(nèi)版本是一致的,若一致則更改并上升版本號(hào),否則認(rèn)為在此期間有其它線程進(jìn)行數(shù)據(jù)更新。假如更新失敗的話,同樣進(jìn)行重試處理。這樣的好處就是可以避免aba問(wèn)題,同時(shí)也可以使用增加后的余額進(jìn)行后續(xù)的操作。目前已知有些公司就是這么操作的

try{
//dosomebuisness
intcount=balService.updateBal(newBal,old_version,new_version,userId);
Assert.businessInvalid(count==0,"updateerror");
//dosomebuisness
}catch(){
//iffailtodosomethingtryagain
}
updatetb_balancesetbalance=#{balance}andbalance=#{new_version}whereversion=#{old_version}anduser_id=#{user_id}

--ifaffectcount>1success
--ifaffectcount=0retry

redission分布式鎖

像集群的項(xiàng)目,我們經(jīng)常會(huì)使用分布式鎖去保證冪等性,如果只有單一接口會(huì)去操作賬戶余額那使用分布式鎖沒(méi)有問(wèn)題,只要在該接口加上鎖,保證同一時(shí)間只有單一線程進(jìn)行該業(yè)務(wù)操作即可;但往往實(shí)際業(yè)務(wù)場(chǎng)景并不會(huì)那么簡(jiǎn)單,比如一個(gè)商城,可能會(huì)有幾十上百個(gè)入口可以對(duì)余額進(jìn)行變更,比如定時(shí)扣費(fèi)、訂單支付、替他人代付等等;那其實(shí)可以通過(guò)面向?qū)ο蟮乃枷?,將余額的操作進(jìn)行抽象,抽象出一個(gè)余額類,將該類的方法加上鎖,然后所有的業(yè)務(wù)都強(qiáng)制通過(guò)該類進(jìn)行余額變更的操作,即可保證操作的可靠性。

所以也就是說(shuō),訂單系統(tǒng)、服務(wù)管理中心等等服務(wù)都不應(yīng)該能直接操作到余額數(shù)據(jù),還是得抽出一個(gè)類型財(cái)務(wù)中臺(tái)的東東去統(tǒng)一處理余額,然后財(cái)務(wù)中臺(tái)中又維護(hù)這么一個(gè)余額類去保證更新的可靠性? 這其實(shí)也就是軟件工程中的單一入口 思想吧

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

Part Two

業(yè)務(wù)背景:現(xiàn)在實(shí)際開發(fā)過(guò)程中會(huì)有這樣一種場(chǎng)景,訂單表a作為訂單業(yè)務(wù)核心表,而會(huì)有a1,a2,a3...an個(gè)業(yè)務(wù)會(huì)去更新訂單表a的狀態(tài),而同時(shí)a.status(訂單狀態(tài))也是作為b,c,d...業(yè)務(wù)操作的核心判斷依據(jù)(也就是在不同的訂單狀態(tài)下可能做的操作是截然相反的)

在代碼層面上,我們一般的寫法是直接用注解開個(gè)事務(wù),以保證操作的原子性。這種寫法目前讓我們的業(yè)務(wù)還是平穩(wěn)運(yùn)行的~

//@apiLock是redis鎖
@ApiLock
@Transactional
publicvoiddosomething(){

}

那么假設(shè)用戶量激增,并發(fā)量暴漲,那么會(huì)出現(xiàn)什么情況呢?

搞事情的時(shí)間來(lái)了,事務(wù)只能保證單個(gè)操作的事務(wù)性,假如并發(fā)量高的時(shí)候,可能就會(huì)出現(xiàn)(假設(shè)b業(yè)務(wù)的前提是a訂單再待接單[wait_acceipt]的狀態(tài)):

b業(yè)務(wù)查詢時(shí),a.status=wait_acceipt,然后b業(yè)務(wù)開始處理;而此時(shí),a1業(yè)務(wù)對(duì)a訂單進(jìn)行操作,并且先于b業(yè)務(wù)處理完,這時(shí)a訂單走到了待服務(wù)(wait_service),而b還在進(jìn)行業(yè)務(wù)處理;然后b業(yè)務(wù)處理完成,并進(jìn)行提交。

那么就會(huì)產(chǎn)生很多異常的數(shù)據(jù)了,而且影響范圍會(huì)很大

解決方案&一些思考

我們可以關(guān)注到,這個(gè)場(chǎng)景的問(wèn)題點(diǎn)其實(shí)并不在數(shù)據(jù)的插入與更新,而是在讀取,在業(yè)務(wù)處理過(guò)程怎么在確定訂單狀態(tài)沒(méi)有發(fā)生改變

使用redis鎖,在讀取訂單時(shí)候?qū)τ唵芜M(jìn)行上鎖,業(yè)務(wù)結(jié)束之后再釋放

單一入口 :將訂單類的操作抽象成一個(gè)order類,然后在這個(gè)order類中去進(jìn)行查詢 操作,或者在不同服務(wù)中用一個(gè)redis-key也是OK的

publicclassOrderService{

lock()

select()

unlock()

}
publicvoiddosomeB(){
try{
orderService.lock(serviceOrderId);
//todo
}finally(){
orderService.unlock(serviceOrderId);
}
}

使用mysql共享鎖(讀鎖),在數(shù)據(jù)庫(kù)層面進(jìn)行阻塞,更加精準(zhǔn),并且不使用單一入口也是可以的,但是可能存在索引失效鎖表的風(fēng)險(xiǎn)(核心表被鎖就炸了)

publicclassOrderService{
/**
*讀取并且上鎖
*/
selectAndLock()

/**
*讀取
*/
select()
}
--讀鎖會(huì)阻塞寫(X),但是不會(huì)堵塞讀(S),在事務(wù)提交后,讀鎖會(huì)自動(dòng)釋放
selectxxxfromorderwhereservice_order_id=xxxlockinsharemode;

總體來(lái)說(shuō) ,思想就是對(duì)正在操作的數(shù)據(jù)進(jìn)行加讀鎖,阻塞其它的線程。當(dāng)然這種方案也是雙刃劍,畢竟會(huì)減少吞吐量,還是應(yīng)該進(jìn)行業(yè)務(wù)梳理,確定加鎖的必要性,避免過(guò)分設(shè)計(jì)~像現(xiàn)在的系統(tǒng),我就沒(méi)去動(dòng)它,hh~


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    4020

    瀏覽量

    68365
  • Version
    +關(guān)注

    關(guān)注

    0

    文章

    32

    瀏覽量

    8011

原文標(biāo)題:并發(fā)場(chǎng)景下如何保證數(shù)據(jù)操作的準(zhǔn)確性?

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    系統(tǒng)快速、穩(wěn)定性和準(zhǔn)確性之間的權(quán)衡

    衡量一個(gè)測(cè)控系統(tǒng)的好壞的標(biāo)準(zhǔn)主要在于該系統(tǒng)的快速、穩(wěn)定性和準(zhǔn)確性,但一般常常會(huì)得此失彼,比如我要滿足系統(tǒng)準(zhǔn)確性,可對(duì)一段時(shí)間采集的數(shù)據(jù)進(jìn)行處理與分析,去除干擾信號(hào),再得到一個(gè)
    發(fā)表于 07-28 11:42

    如何提高工程預(yù)算的準(zhǔn)確性

    工程量。工程量的計(jì)算是編好施工圖預(yù)算的主要環(huán)節(jié),是整個(gè)預(yù)算編制過(guò)程中最繁雜的一個(gè)工序,用工時(shí)最多,出錯(cuò)可能也最多,而工程量又是整個(gè)預(yù)算的主要數(shù)據(jù),是計(jì)算的基礎(chǔ),因此,一定要抓好工程量的準(zhǔn)確性。
    發(fā)表于 07-25 17:35

    如何確認(rèn)延時(shí)函數(shù)時(shí)間的準(zhǔn)確性?

    如何確認(rèn)延時(shí)函數(shù)時(shí)間的準(zhǔn)確性?
    發(fā)表于 01-27 07:35

    如何提高投標(biāo)報(bào)價(jià)編制的準(zhǔn)確性

        施工企業(yè)要在激烈的市場(chǎng)競(jìng)爭(zhēng)中戰(zhàn)勝對(duì)手,贏得工程項(xiàng)目,投標(biāo)報(bào)價(jià)的準(zhǔn)確性是關(guān)鍵。下面結(jié)合多年工作的實(shí)際,談一如何提高投標(biāo)報(bào)價(jià)編制的準(zhǔn)確性。
    發(fā)表于 01-08 15:36 ?13次下載

    越南VNTA部署基于AI的射頻測(cè)試系統(tǒng),保證測(cè)試的準(zhǔn)確性和一致

    由R&S BTC和RFSpark組成的自動(dòng)化射頻測(cè)試系統(tǒng)可優(yōu)化人力資本投資,并保證測(cè)試的準(zhǔn)確性和一致
    的頭像 發(fā)表于 05-15 16:17 ?4341次閱讀

    保證雙法蘭液位計(jì)測(cè)量的準(zhǔn)確性的方法

    為了保證雙法蘭液位計(jì)液位測(cè)量的準(zhǔn)確性,必須首先保證容器內(nèi)氣相、液相介質(zhì)對(duì)差壓變送器高、低壓側(cè)作用壓力傳遞的準(zhǔn)確性,從壓力作用的起點(diǎn)出發(fā),根據(jù)雙法蘭液位計(jì)的組成部分和工作原理來(lái)分析應(yīng)用中
    發(fā)表于 07-19 11:59 ?3112次閱讀

    制造行業(yè)BOM如何保證準(zhǔn)確性

    制造行業(yè)BOM如何保證準(zhǔn)確性:使用專業(yè)的BOM軟件可以幫助制造商創(chuàng)建準(zhǔn)確的BOM。這種軟件不僅可以自動(dòng)檢查錯(cuò)誤,還可以輕松地更新和修改BOM。比如,彩虹企業(yè)圖紙管理軟件?,系統(tǒng)中...
    的頭像 發(fā)表于 03-27 11:02 ?1745次閱讀
    制造行業(yè)BOM如何<b class='flag-5'>保證</b><b class='flag-5'>準(zhǔn)確性</b>?

    怎樣測(cè)試電流探頭的準(zhǔn)確性以及保證其精準(zhǔn)

    隨著科技的不斷發(fā)展,電流探頭的應(yīng)用范圍越來(lái)越廣泛。在各種電子產(chǎn)品的設(shè)計(jì)和生產(chǎn)過(guò)程中,電流探頭的準(zhǔn)確性對(duì)于檢測(cè)和測(cè)量電流顯得尤為重要。那么,怎樣測(cè)試電流探頭的準(zhǔn)確性以及保證其精準(zhǔn)呢?
    的頭像 發(fā)表于 12-14 10:49 ?1429次閱讀
    怎樣測(cè)試電流探頭的<b class='flag-5'>準(zhǔn)確性</b>以及<b class='flag-5'>保證</b>其精準(zhǔn)<b class='flag-5'>性</b>

    如何保證測(cè)長(zhǎng)機(jī)測(cè)量的準(zhǔn)確性?

    可以通過(guò)以下方法保證測(cè)長(zhǎng)機(jī)測(cè)量的準(zhǔn)確性:一、設(shè)備方面1.定期校準(zhǔn)按照規(guī)定的時(shí)間間隔,將測(cè)長(zhǎng)機(jī)送往專業(yè)的計(jì)量機(jī)構(gòu)或使用標(biāo)準(zhǔn)器進(jìn)行校準(zhǔn)。校準(zhǔn)可以確定測(cè)長(zhǎng)機(jī)的測(cè)量誤差,并對(duì)其進(jìn)行調(diào)整,確保測(cè)量結(jié)果的準(zhǔn)確性
    的頭像 發(fā)表于 10-25 16:16 ?1519次閱讀
    如何<b class='flag-5'>保證</b>測(cè)長(zhǎng)機(jī)測(cè)量的<b class='flag-5'>準(zhǔn)確性</b>?

    如何提升ASR模型的準(zhǔn)確性

    提升ASR(Automatic Speech Recognition,自動(dòng)語(yǔ)音識(shí)別)模型的準(zhǔn)確性是語(yǔ)音識(shí)別技術(shù)領(lǐng)域的核心挑戰(zhàn)之一。以下是一些提升ASR模型準(zhǔn)確性的關(guān)鍵方法: 一、優(yōu)化數(shù)據(jù)收集與處理
    的頭像 發(fā)表于 11-18 15:14 ?3414次閱讀

    如何保證硫酸銅參比電極測(cè)量數(shù)據(jù)準(zhǔn)確性

    硫酸銅參比電極測(cè)量數(shù)據(jù)準(zhǔn)確性,可從電極的選擇、安裝、使用和維護(hù)等方面采取相應(yīng)措施,具體如下: 選擇合適的電極 質(zhì)量可靠:選擇有質(zhì)量保證的硫酸銅參比電極,確保其內(nèi)部結(jié)構(gòu)合理、材料純度高,以減少因電極
    的頭像 發(fā)表于 05-19 10:21 ?603次閱讀
    如何<b class='flag-5'>保證</b>硫酸銅參比電極測(cè)量<b class='flag-5'>數(shù)據(jù)</b>的<b class='flag-5'>準(zhǔn)確性</b>

    測(cè)縫計(jì)測(cè)量數(shù)據(jù)準(zhǔn)確性和校準(zhǔn)方法解析

    在結(jié)構(gòu)物安全監(jiān)測(cè)領(lǐng)域,數(shù)據(jù)準(zhǔn)確性是評(píng)估工程健康狀態(tài)的核心依據(jù)。振弦式測(cè)縫計(jì)作為主流裂縫監(jiān)測(cè)設(shè)備,其測(cè)量精度直接影響裂縫發(fā)展趨勢(shì)的判斷。那么如何確保測(cè)縫計(jì)測(cè)量數(shù)據(jù)準(zhǔn)確性以及如何校準(zhǔn)?下
    的頭像 發(fā)表于 07-07 13:56 ?672次閱讀
    測(cè)縫計(jì)測(cè)量<b class='flag-5'>數(shù)據(jù)</b>的<b class='flag-5'>準(zhǔn)確性</b>和校準(zhǔn)方法解析

    如何保證數(shù)據(jù)校驗(yàn)系統(tǒng)的時(shí)間同步以提高準(zhǔn)確性?

    在電能質(zhì)量監(jiān)測(cè)的數(shù)據(jù)校驗(yàn)系統(tǒng)中, 時(shí)間同步的準(zhǔn)確性直接決定了多監(jiān)測(cè)點(diǎn)數(shù)據(jù)的時(shí)空一致、暫態(tài)事件的時(shí)序匹配度,以及校驗(yàn)結(jié)果的可信度 。要保證時(shí)
    的頭像 發(fā)表于 09-19 11:28 ?664次閱讀

    除了校準(zhǔn),還有哪些方法可以保證電能質(zhì)量在線監(jiān)測(cè)裝置的準(zhǔn)確性?

    除校準(zhǔn)外,保證電能質(zhì)量在線監(jiān)測(cè)裝置準(zhǔn)確性需覆蓋 硬件選型、安裝部署、環(huán)境控制、數(shù)據(jù)鏈路、日常運(yùn)維、系統(tǒng)協(xié)同 等全生命周期環(huán)節(jié),通過(guò) “源頭把控 + 過(guò)程管理 + 動(dòng)態(tài)驗(yàn)證” 形成閉環(huán)保障。以下是 7
    的頭像 發(fā)表于 09-19 14:15 ?687次閱讀
    除了校準(zhǔn),還有哪些方法可以<b class='flag-5'>保證</b>電能質(zhì)量在線監(jiān)測(cè)裝置的<b class='flag-5'>準(zhǔn)確性</b>?

    電能質(zhì)量在線監(jiān)測(cè)裝置定位諧波源的準(zhǔn)確性有多高?

    電能質(zhì)量在線監(jiān)測(cè)裝置定位諧波源的準(zhǔn)確性 沒(méi)有固定數(shù)值 ,而是受 “ 監(jiān)測(cè)網(wǎng)絡(luò)設(shè)計(jì)、技術(shù)參數(shù)精度、算法適配、電網(wǎng)工況復(fù)雜 ” 四大核心因素影響,呈現(xiàn) “ 場(chǎng)景化差異 ”—— 在理想條
    的頭像 發(fā)表于 09-26 15:20 ?607次閱讀