色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

并發場景下如何保證數據操作的準確性?

jf_ro2CN3Fa ? 來源:juejin.cn ? 2023-07-09 16:02 ? 次閱讀

  • Part One
  • Part Two


Part One

我們假想一個場景,在并發場景下,假如要對賬戶余額(tb_balance.balance)進行增加和減少余額,要怎么設計才能保證數據不出錯呢?

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

直接sql更新

直接balance自增20,怎么并發都余額都不會錯了是不是~,但這里會有問題,1.假如是減余額的話,要注意余額不能小于0 2.假如后續需要用這個余額結果再進行一些業務操作的話,是取不到這個余額的sql

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

CAS

經典的compare and swap,就是入庫時去對比舊值是否與現數據庫中的值相等,若相等則更新否則不更新,但是會有風險,就是經典的aba問題。假如更新返回的影響數為0的話,說明余額已經發生了變化,所以需要拋出異常并進行重試。(這里需要寫一些補償的業務邏輯去處理余額更新失敗的問題)

/**
*用戶余額增加20
*newBal為新值
*oldBal為庫中查出的值
**/
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}

樂觀鎖

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

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分布式鎖

像集群的項目,我們經常會使用分布式鎖去保證冪等性,如果只有單一接口會去操作賬戶余額那使用分布式鎖沒有問題,只要在該接口加上鎖,保證同一時間只有單一線程進行該業務操作即可;但往往實際業務場景并不會那么簡單,比如一個商城,可能會有幾十上百個入口可以對余額進行變更,比如定時扣費、訂單支付、替他人代付等等;那其實可以通過面向對象的思想,將余額的操作進行抽象,抽象出一個余額類,將該類的方法加上鎖,然后所有的業務都強制通過該類進行余額變更的操作,即可保證操作的可靠性。

所以也就是說,訂單系統、服務管理中心等等服務都不應該能直接操作到余額數據,還是得抽出一個類型財務中臺的東東去統一處理余額,然后財務中臺中又維護這么一個余額類去保證更新的可靠性? 這其實也就是軟件工程中的單一入口 思想吧

基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

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

Part Two

業務背景:現在實際開發過程中會有這樣一種場景,訂單表a作為訂單業務核心表,而會有a1,a2,a3...an個業務會去更新訂單表a的狀態,而同時a.status(訂單狀態)也是作為b,c,d...業務操作的核心判斷依據(也就是在不同的訂單狀態下可能做的操作是截然相反的)

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

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

}

那么假設用戶量激增,并發量暴漲,那么會出現什么情況呢?

搞事情的時間來了,事務只能保證單個操作的事務性,假如并發量高的時候,可能就會出現(假設b業務的前提是a訂單再待接單[wait_acceipt]的狀態):

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

那么就會產生很多異常的數據了,而且影響范圍會很大

解決方案&一些思考

我們可以關注到,這個場景的問題點其實并不在數據的插入與更新,而是在讀取,在業務處理過程怎么在確定訂單狀態沒有發生改變

使用redis鎖,在讀取訂單時候對訂單進行上鎖,業務結束之后再釋放

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

publicclassOrderService{

lock()

select()

unlock()

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

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

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

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

總體來說 ,思想就是對正在操作的數據進行加讀鎖,阻塞其它的線程。當然這種方案也是雙刃劍,畢竟會減少吞吐量,還是應該進行業務梳理,確定加鎖的必要性,避免過分設計~像現在的系統,我就沒去動它,hh~


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據庫
    +關注

    關注

    7

    文章

    3794

    瀏覽量

    64362
  • Version
    +關注

    關注

    0

    文章

    32

    瀏覽量

    7551

原文標題:并發場景下如何保證數據操作的準確性?

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    系統快速、穩定性和準確性之間的權衡

    衡量一個測控系統的好壞的標準主要在于該系統的快速、穩定性和準確性,但一般常常會得此失彼,比如我要滿足系統準確性,可對一段時間采集的數據進行處理與分析,去除干擾信號,再得到一個
    發表于 07-28 11:42

    如何提高工程預算的準確性

    工程量。工程量的計算是編好施工圖預算的主要環節,是整個預算編制過程中最繁雜的一個工序,用工時最多,出錯可能也最多,而工程量又是整個預算的主要數據,是計算的基礎,因此,一定要抓好工程量的準確性。
    發表于 07-25 17:35

    如何確認延時函數時間的準確性?

    如何確認延時函數時間的準確性?
    發表于 01-27 07:35

    如何提高投標報價編制的準確性

        施工企業要在激烈的市場競爭中戰勝對手,贏得工程項目,投標報價的準確性是關鍵。下面結合多年工作的實際,談一如何提高投標報價編制的準確性
    發表于 01-08 15:36 ?13次下載

    越南VNTA部署基于AI的射頻測試系統,保證測試的準確性和一致

    由R&S BTC和RFSpark組成的自動化射頻測試系統可優化人力資本投資,并保證測試的準確性和一致。
    的頭像 發表于 05-15 16:17 ?3623次閱讀

    保證雙法蘭液位計測量的準確性的方法

    為了保證雙法蘭液位計液位測量的準確性,必須首先保證容器內氣相、液相介質對差壓變送器高、低壓側作用壓力傳遞的準確性,從壓力作用的起點出發,根據雙法蘭液位計的組成部分和工作原理來分析應用中
    發表于 07-19 11:59 ?2363次閱讀

    了解電源監視器的準確性

    了解電源監視器的準確性
    發表于 04-18 08:46 ?0次下載
    了解電源監視器的<b class='flag-5'>準確性</b>

    制造行業BOM如何保證準確性?

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

    怎樣測試電流探頭的準確性以及保證其精準

    隨著科技的不斷發展,電流探頭的應用范圍越來越廣泛。在各種電子產品的設計和生產過程中,電流探頭的準確性對于檢測和測量電流顯得尤為重要。那么,怎樣測試電流探頭的準確性以及保證其精準呢?
    的頭像 發表于 12-14 10:49 ?620次閱讀
    怎樣測試電流探頭的<b class='flag-5'>準確性</b>以及<b class='flag-5'>保證</b>其精準<b class='flag-5'>性</b>

    8芯M16插頭數據傳輸的準確性

      德索工程師說道8芯M16插頭作為高性能連接器,其數據傳輸的準確性對于整個系統的穩定性和可靠至關重要。以下是對8芯M16插頭數據傳輸準確性
    的頭像 發表于 06-14 18:06 ?314次閱讀
    8芯M16插頭<b class='flag-5'>數據</b>傳輸的<b class='flag-5'>準確性</b>

    景區負氧離子監測站的數據準確性如何?

    BK-FZ5景區負氧離子監測站的數據準確性是評估其性能的重要指標之一,其準確性受到多個因素的影響。
    的頭像 發表于 07-31 14:41 ?298次閱讀
    景區負氧離子監測站的<b class='flag-5'>數據</b><b class='flag-5'>準確性</b>如何?

    影響電源紋波測試準確性的因素

    電源紋波測試是評估電源質量的重要手段之一,它能夠反映出電源在輸出電壓中的波動情況。然而,測試過程中的多種因素都可能對測試結果的準確性產生影響。本文將從多個方面分析影響電源紋波測試準確性的因素,并提
    的頭像 發表于 08-02 09:42 ?600次閱讀

    如何保證測長機測量的準確性

    可以通過以下方法保證測長機測量的準確性:一、設備方面1.定期校準按照規定的時間間隔,將測長機送往專業的計量機構或使用標準器進行校準。校準可以確定測長機的測量誤差,并對其進行調整,確保測量結果的準確性
    的頭像 發表于 10-25 16:16 ?313次閱讀
    如何<b class='flag-5'>保證</b>測長機測量的<b class='flag-5'>準確性</b>?

    如何評估 ChatGPT 輸出內容的準確性

    評估 ChatGPT 輸出內容的準確性是一個復雜的過程,因為它涉及到多個因素,包括但不限于數據的質量和多樣、模型的訓練、上下文的理解、以及輸出內容的邏輯一致。以下是一些評估 Cha
    的頭像 發表于 10-25 17:48 ?575次閱讀

    如何提升ASR模型的準確性

    提升ASR(Automatic Speech Recognition,自動語音識別)模型的準確性是語音識別技術領域的核心挑戰之一。以下是一些提升ASR模型準確性的關鍵方法: 一、優化數據收集與處理
    的頭像 發表于 11-18 15:14 ?749次閱讀
    主站蜘蛛池模板: 99久久国产露脸精品竹菊传煤| 18禁国产精品久久久久久麻豆| 伊人yinren6综合网色狠狠| 中文字幕在线观看亚洲视频| 边摸边吃奶边做下面视频| 国产午夜精品鲁丝片| 美女伸开两腿让我爽| 婷婷射精AV这里只有精品| 瑜伽牲交AV| 国产99精品视频| 久久精品无码人妻无码AV蜜臀 | 午夜国产视频| 中字幕视频在线永久在线观看免费| 草草久久久无码国产专区全集观看| 国产综合欧美区在线| 欧美一级情欲片在线| 亚洲欧美自拍清纯中文字幕| qvod播放电影| 久久精品美女| 乌克兰美女x?x?y?y| 99久久久精品| 久久99re热在线观看视频| 日日噜噜大屁股熟妇| 最新毛片网| 国产中文在线| 日日干夜夜啪蕉视频| 1788vv视频| 国内精品人妻无码久久久影院蜜桃 | 视频一区国产在线二区| 最新影音先锋av资源台| 国产在线aaa片一区二区99 | 国产精品2020观看久久| 美女裸露100%奶头视频| 亚洲免费在线观看| 国产成人8x视频一区二区| 男人网站在线观看| 伊人久久中文大香线蕉综合| 国产精品资源在线观看网站| 桥本有菜护士| 2019夜夜| 久久是热这里只有精品|