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

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

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

3天內不再提示

加鎖失效,非鎖之過,加之錯也

京東云 ? 來源:jf_75140285 ? 作者:jf_75140285 ? 2024-11-05 17:52 ? 次閱讀

引言

多個進程或線程同時(或著說在同一段時間內)訪問同一資源會產生并發問題。

?

銀行兩操作員同時操作同一賬戶就是典型的例子。比如A、B操作員同時讀取一余額為1000元的賬戶,A操作員為該賬戶增加100元,B操作員同時為該賬戶減去 50元,A先提交,B后提交。 最后實際賬戶余額為1000-50=950元,但本該為1000+100-50=1050。這就是典型的并發問題

?

從事零售供應鏈庫存業務,對庫存數量操作增減十分頻繁,同樣存在類似上述銀行取款遇到的問題,庫存數量操作有誤勢必給前臺銷售產生損失影響,因此需要關注對庫存數量并發操作下的一致性。

?

下面通過一個真實的案例分享在并發情況下如何保證庫存數量的準確性。

問題是什么-加鎖失效

看看下面這段流程和代碼,思考會有并發問題嗎?

wKgaomcoYW-Ae9-CAAFgOMxxRWA504.png

?

1.加鎖前,獲取箱子明細數據,此處在鎖之外,存在并發臟讀問題

wKgZomcoYXCADd8pAAHpaEKHmfo247.png

?

2.加鎖后,并進行箱子上架分批次回傳業務處理

wKgaomcoYXKAWp4kAAMnCp_ccqE913.png

?

3.加鎖后,更新箱子明細上架數量邏輯:已上架數量 = 加鎖前的明細數據(臟讀) + 報文回傳的明細數據 直接進行行更新

wKgZomcoYXSAKeLHAAc6EXS9O2o758.png

原因是什么-加鎖的位置不正確

wKgaomcoYXWATQwzAAM5pLTPczs062.png

核心的問題原因

1.業務分布式鎖失效:使用分布式鎖加鎖了,但是仍然使用加鎖前查詢的數據,導致出現臟讀

2.Mysql鎖失效:數據庫更新時,未上任何鎖,導致臟讀的數據直接覆蓋更新當前行

?

有同學這時問了,為啥防重碼也沒有生效呢?

防重碼主要是用作冪等邏輯的,同一個請求多次處理,結果仍然是相同的。

但是這是兩次不同的請求,防重碼是不同的,因此不能只依賴防重碼保證一致性。

?

解決方案有哪些

1、代碼層面:使用鎖(如互斥鎖、讀寫鎖、分布式鎖等)來控制資源的訪問,數據獲取的全部操作都需要再獲取鎖后才進行。

將獲取箱子明細的代碼移動到加鎖之后,只有獲取到分布式鎖,才能執行分批次上架查詢和更新(串行化)

wKgZomcoYXaARau2AALOgDkTuUY983.png

對應改造后的代碼:

wKgaomcoYXiAY4NNAAWUowUe7HI787.png

?

2、數據庫層面:實現事務管理,確保數據的一致性;合理設置事務隔離級別,以防止臟讀、或者采用樂觀鎖或悲觀鎖來處理并發更新,合理設計查詢效率,減少鎖競爭。

數據庫的并發上鎖處理和業務代碼的上鎖是互補的關系

因為無法保證后續業務的調整或其他業務代碼的調用能始終保持獲取數據的一致性,數據庫的并發上鎖處理更多是一種兜底保證機制。

?

樂觀鎖更新

wKgZomcoYXqAR3Y4AAJBf6DRpQk551.png

?

悲觀鎖更新

wKgaomcoYXuAOJ7IAAHiDtjHNY4446.png

?

擴展方案

1.應用程序設計: 在應用程序設計階段,盡量避免長時間持有數據庫連接或事務,減少并發操作的可能性,利用AI代碼評審或者人工提前找出可能出現并發問題的地方;合理設置鎖的粒度,避免鎖失效。

?

1. 網絡負載層面:采用限流控制訪問頻率;采用分布式數據庫,進行數據分片,降低單節點并發壓力;使用負載均衡,將網絡請求分發到不同的服務器,提高系統處理并發的能力,防止系統過載。

?

1.請求層面:前端點擊防重、系統冪等防重、盡可能降低同一請求的多次重試訪問引起的一致性問題。

?

通過以上措施,可以在不同層面有效地防止并發問題,保證系統的數據的一致性

審核編輯 黃宇

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

    關注

    1

    文章

    903

    瀏覽量

    74536
  • 代碼
    +關注

    關注

    30

    文章

    4791

    瀏覽量

    68677
收藏 人收藏

    評論

    相關推薦

    阻塞賦值容易語法點討論

    本帖最后由 eehome 于 2013-1-5 10:05 編輯 阻塞賦值容易語法點討論請教下大家!我發現光盤里的例程有一段是這樣子的:always @(dac_sta
    發表于 12-22 09:53

    Linux高級編程---互斥

    當前互斥被解鎖。pthread_mutex_trylock()函數是一個阻塞型的上鎖函數,如果互斥沒被鎖住,pthread_mutex_trylock()函數將把互斥
    發表于 01-13 10:07

    轉第16章 FreeRTOS調度,任務和中斷

    的任務函數,但是使用FreeRTOS現有的功能有兩種實現方法:(1)通過給調度器加鎖實現利用FreeRTOS的調度功能給調度器加鎖的話,將關閉任務切換功能,從而高優先級任務也就無法
    發表于 09-01 07:45

    STM32F427的FMC地址數據總線復用控制SRAM必須要加鎖存器嗎

    用STM32F427的FMC控制SRAM,由于端口不夠用,想用FMC的數據地址總線復用功能,請問,是不是要加鎖存器存地址,求電路
    發表于 09-18 11:35

    設計電子密碼時,怎么實現控制密碼輸幾次就不能再輸入的功能

    設計電子密碼時,怎么實現控制密碼輸幾次就不能再輸入的功能
    發表于 06-19 20:36

    帶自功能的密碼制作方法分享

    開鎖。先按AN7不能開鎖已如上述。本密碼的按鍵順序只能是AN2、AN5、AN7。當按下任何一個密碼鍵時,SCR1導通,使VT2飽和導通,各按鍵失效,電路鎖定為關斷狀態。這時必須斷
    發表于 05-20 06:43

    Altium Designer規則設計技巧之過孔和焊盤

    本文主要介紹了Altium Designer規則設計技巧之過孔和焊盤.
    發表于 06-22 08:00 ?34次下載
    Altium Designer規則設計技巧<b class='flag-5'>之過</b>孔和焊盤

    詳解/互鎖/自的區別

    為了滿足不同的應用需要,解碼接收電路的輸出模式通常分為,互鎖,自,混合輸出。幾種模式通俗的說,鎖相當于輕觸開關,互鎖相當于風扇的檔位開關,自鎖相當于電燈開關。
    發表于 10-07 15:26 ?7834次閱讀

    指紋密碼失效原因及對應的解決方案

    密碼指紋失效怎么辦?指紋密碼失效是什么原因造成的?在部分用戶使用指紋的時候,會有小概率發生指紋失效
    發表于 06-12 14:30 ?10.4w次閱讀

    select......for update會表還是行?

    驗證 結合一下實例驗證 結果 ? select查詢語句是不會加鎖的,但是select .......for update除了有查詢的作用外,還會加鎖呢,而且它是悲觀。 那么它加的是行
    的頭像 發表于 10-10 15:54 ?1528次閱讀

    Linux互斥的作用 互斥是什么

    1、互斥 互斥(mutex),在訪問共享資源之前對互斥進行上鎖,在訪問完成后釋放互斥(解鎖);對互斥進行上鎖之后,任何其它試圖再次
    的頭像 發表于 07-21 11:13 ?951次閱讀

    讀寫的實現原理規則

    讀寫 互斥或自旋要么是加鎖狀態、要么是不加鎖狀態,而且一次只有一個線程可以對其加鎖。 讀寫
    的頭像 發表于 07-21 11:21 ?922次閱讀
    讀寫<b class='flag-5'>鎖</b>的實現原理規則

    數據庫如何實現分布式

    主要是用來避免死鎖,防止不必要的線程等待和資源浪費 可重入性 一個線程在持有的情況下,可以再次請求加鎖 高性能,高可用 加鎖釋放的操作盡量使用更少的資源,提高性能。同時也要保證高可
    的頭像 發表于 10-08 16:12 ?4817次閱讀

    什么是分布式 Redis的五種分布式方案

    本地加鎖的方式在分布式的場景下不適用,所以本文我們來探討下如何引入分布式解決本地的問題。本篇所有代碼和業務基于我的開源項目 PassJava。
    發表于 10-23 11:35 ?1217次閱讀
    什么是分布式<b class='flag-5'>鎖</b> Redis的五種分布式<b class='flag-5'>鎖</b>方案

    C語言加鎖沒有鎖住是什么原因?

    C語言加鎖沒有鎖住是什么原因? C語言中的機制主要是通過線程庫提供的函數來實現的,主要用于多線程編程中的資源同步與互斥。加鎖的目的是確保同一時刻只有一個線程可以訪問某個共享資源,以防止數據競爭
    的頭像 發表于 11-22 17:41 ?636次閱讀
    主站蜘蛛池模板: 久久精品电影| www.av一区| 欧美xxxxx九色视频免费观看| 超碰国产人人做人人爽| 幺妹视频福利视频| 三级色视频| 免费人成视频19674不收费| 国产人成精品综合欧美成人| CHINA中国东北GURMA| 亚洲影院在线播放| 四虎视频最新视频在线观看| 女仆翻身大作战| 久久天堂成人影院| 韩国g奶空姐| 高清日本片免费观看| 99精品视频在线| 伊人影院综合在线| 亚洲高清国产拍精品5g| 十八禁肉动漫无修在线播放| 欧美激情一区二区三区AA片| 久久亚洲精品2017| 精品日产1区2卡三卡麻豆| 国产精品视频大全| 国产超碰AV人人做人人爽| 超级碰碰青草久热国产| 91精选国产| 2019久久这里只精品热在线观看| 夜夜国产亚洲视频香蕉| 亚洲XXX午休国产熟女屁| 受被三个攻各种道具PLAY| 热re99久久精品国99热| 暖暖日本在线手机免费完整版 | 99久久夜色精品国产亚洲AV卜| 亚洲乱亚洲乱妇在线观看| 亚洲AV久久无码精品九号| 先锋影音av资源站av| 午夜家庭影院| 亚欧乱亚欧乱色视频| 亚洲.欧美.中文字幕在线观看| 掀开奶罩边躁狠狠躁软学生| 性虎成人网|