日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

后端|一個分布式鎖「失效」的案例分析

來源: 責編: 時間:2023-09-22 20:12:59 449觀看
導讀小猿最近很苦惱:明明加了分布式鎖,為什么并發還是會出問題呢?故事從接到需求開始說起。接到需求小猿前一陣接到一個小任務,里面有一個功能對應的場景如下:封裝一個對賬戶余額進行加減操作的方法;所屬服務部署了多個實例;這個

小猿最近很苦惱:明明加了分布式鎖,為什么并發還是會出問題呢?3QY28資訊網——每日最新資訊28at.com

故事從接到需求開始說起。3QY28資訊網——每日最新資訊28at.com

3QY28資訊網——每日最新資訊28at.com

但實際的時序:3QY28資訊網——每日最新資訊28at.com

3QY28資訊網——每日最新資訊28at.com

也就是說期望是這樣的執行順序:3QY28資訊網——每日最新資訊28at.com

3QY28資訊網——每日最新資訊28at.com

但實際的執行順序:3QY28資訊網——每日最新資訊28at.com

3QY28資訊網——每日最新資訊28at.com

分布式鎖和事務,都是通過 AOP 來實現的,而 AOP 的執行順序是根據切面的優先級來的,而小猿的分布式鎖切面的優先級比事務切面的優先級低,所以就出現了上面的時序問題。3QY28資訊網——每日最新資訊28at.com

于是通過給分布式鎖的切面指定 Order 的方式,讓它的優先級高于事務切面(注:Order 值越小,執行優先級越高),驗證完沒問題后,就又高高興興地更新完版本,修復好歷史問題數據后回家了。3QY28資訊網——每日最新資訊28at.com

還有問題

誰知道第二天一早,還是有極少量的用戶反饋賬戶余額不對的問題。3QY28資訊網——每日最新資訊28at.com

這次小猿就有點懵了,為什么還會出現這種情況呢?3QY28資訊網——每日最新資訊28at.com

經過一番艱苦卓絕的排查,終于找到了問題所在:事務嵌套。3QY28資訊網——每日最新資訊28at.com

從前文中的示例代碼中可以看到,小猿的方法上加了事務注解 @Transactional(rollbackFor = Exception.class) 里,沒有指定事務的傳播行為,默認是 Propagation.REQUIRED,也就是說如果當前沒有事務,就新建一個事務;如果當前有事務,就加入到當前事務中。3QY28資訊網——每日最新資訊28at.com

小猿自己寫的代碼里沒有在事務方法里嵌套調用這個方法的情況,但是同事寫的代碼里有,這樣就會導致前文的時序問題再次發生。3QY28資訊網——每日最新資訊28at.com

找到問題就好辦了,小猿將自己的方法上的事務傳播行為改成了 Propagation.REQUIRES_NEW,也就是說如果當前沒有事務,就新建一個事務;如果當前有事務,就將當前事務掛起,新建一個事務。3QY28資訊網——每日最新資訊28at.com

這次更新完版本后,小猿就再也沒有收到用戶反饋了,終于可以安心回家睡覺了。3QY28資訊網——每日最新資訊28at.com

小結

在日常的開發過程中,如果涉及到并發和事務,一定要多留幾個心眼,考慮周全,確認以下要點是否都正確實現:3QY28資訊網——每日最新資訊28at.com

  • 是否做了必要的并發控制?
  • 事務的傳播行為是否符合預期?
  • AOP 的執行順序是否符合預期?
  • 對并發的場景是否做了充分的測試?
  • 對于比較關鍵的操作,是否打印了必要的日志?

本文鏈接:http://www.www897cc.com/showinfo-26-11218-0.html后端|一個分布式鎖「失效」的案例分析

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 【Django入門】第一個Django項目

下一篇: 玩轉Python屬性和方法,成為高手不再難!

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 芦山县| 万安县| 梁河县| 都兰县| 富民县| 淮安市| 邵阳县| 辰溪县| 孟州市| 兰溪市| 大石桥市| 铁岭市| 双辽市| 伊吾县| 达日县| 黄冈市| 永丰县| 伊春市| 福泉市| 林西县| 邓州市| 卢龙县| 汝阳县| 宜章县| 天水市| 东港市| 盐边县| 隆林| 东丰县| 商都县| 蓝山县| 通城县| 启东市| 星子县| 聂荣县| 天门市| 深州市| 读书| 佛山市| 西丰县| 秦安县|