最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python編程項目中線上問題排查與解決

 更新時間:2021年11月01日 11:38:15   作者:Python 技術  
因為業(yè)務上的設計存在問題,導致數(shù)據(jù)庫表總是被鎖,而且是不定期的鎖定,導致服務器運行異常,今天就來跟大家說說該如何避免這種問題

文 | 極光

來源:Python 技術「ID: pythonall」

最近開發(fā)中遇到個小問題,因為業(yè)務上的設計存在問題,導致數(shù)據(jù)庫表總是被鎖,而且是不定期的鎖定,導致服務器運行異常,最后經過排查原因是多線程同時更新同一表中同一條記錄導致問題。今天就來跟大家說說該如何避免這種問題。

問題描述

最近因為公司業(yè)務需要,產品設計了一套業(yè)務系統(tǒng),據(jù)說會有很多內部和外部人員使用,拿到系統(tǒng)說明我們研發(fā)部門拼命加班趕時間,經歷了兩個月的后終于把系統(tǒng)上線運行。

剛開始用的人少,并沒有出現(xiàn)什么問題,感覺系統(tǒng)還是很穩(wěn)定,隨著后來用的人越來越多,系統(tǒng)就開始出現(xiàn)一些莫名其妙的問題,其中就有某些業(yè)務信息在更新的時候總是報錯,查日志就發(fā)現(xiàn)是表記錄被鎖定導致更新失敗。

找到錯誤問題后我們就開始一遍遍的翻日志,各種分析查找到底是什么原因導致了表記錄被鎖。最后發(fā)現(xiàn)這個表的狀態(tài)字段,存在多個接口方法同時更新的情況,而且經常是同時操作的。也就是數(shù)據(jù)庫中存在多個會話同時操作同一表中同一行記錄,從而導致表記錄被鎖。

問題分析

那定位到問題,要如何解決呢?這里我們先了解兩個名詞:

悲觀鎖(Pessimistic Lock):簡單解釋就是很悲觀,每次去拿數(shù)據(jù)的時候都認為別人會修改,所以每次在修改數(shù)據(jù)的時候都會上鎖,這樣別人想修改這個數(shù)據(jù)就會等待一直到它能拿到鎖。

樂觀鎖(Optimistic Lock):這個正好相反,就是很樂觀,每次去修改數(shù)據(jù)的時候都認為別人不會修改,所以不會上鎖,但是在提交更新的時候會判斷一下在此期間別人有沒有去更新這個數(shù)據(jù)。樂觀鎖適用于讀多寫少的應用場景,這樣可以提高吞吐量。

通過這兩種方式就能解決問題,不過選哪種比較好,我們來簡單分析下:

  • 悲觀鎖 通過 “select …… for update” 實現(xiàn),就是在更新表前先對這條記錄進行上鎖,然后下面再執(zhí)行更新語句。不過這種方式有些太重,畢竟加鎖還是需要很大時間成本的,不符合業(yè)務的需要,直接pass掉。
  • 樂觀鎖 相對就要輕量很多,它的主要實現(xiàn)就是通過在表中多增加一個記錄版本的字段,比如 version 。然后每次查詢記錄要更新時,where 后面都要加上 version=? ,這樣當你查詢拿到 version 后,如果有其他會話更新了這個字段,那這個 version 就會和你現(xiàn)在拿的不一樣,從而會使你這次的更新失效,需要重新獲取最新 version 后再次執(zhí)行 update 語句。

問題解決

好了,經過以上分析,已經有了比較清晰的解決思路,剩下就是碼代碼了:

    /**
     * 樂觀鎖更新
     * @param id
     * @return
     */
    public boolean update(int id){
        int cnt = 0;
        while (cnt == 0) {
            USER user = query("SELECT * FROM table_user WHERE id = #{id}", id);
            cnt = update("UPDATE table_user SET version=version + 1, status = 2 WHERE id=#{id} AND version=#{version}", id, user.version());
            if(cnt > 0){
               // 返回更新成功
                return true;
            }
        }
        return false;
    }
 

總結

這里只是基于 Mysql 自身特性解決這個問題,當然還有很多其他的方式可以解決,例如通過 Redis 或者 MQ 消息隊列等,如果大家感興趣我們可以以后再介紹。

更多關于python線上問題排查與解決的資料請關注腳本之家其它相關文章!

相關文章

  • 基于python3生成標簽云代碼解析

    基于python3生成標簽云代碼解析

    這篇文章主要介紹了基于python3生成標簽云代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • 使用Python開發(fā)Excel表格數(shù)據(jù)對比工具

    使用Python開發(fā)Excel表格數(shù)據(jù)對比工具

    這篇文章主要為大家詳細介紹了如何通過 Python 和 PyQt5 結合 pandas 庫,快速實現(xiàn)一個高效、自動化的 Excel 數(shù)據(jù)對比工具,感興趣的小伙伴可以了解下
    2025-03-03
  • Python內置函數(shù) next的具體使用方法

    Python內置函數(shù) next的具體使用方法

    這篇文章主要介紹了Python內置函數(shù) next的具體使用方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • Python+OpenCV實現(xiàn)圖像融合的原理及代碼

    Python+OpenCV實現(xiàn)圖像融合的原理及代碼

    這篇文章主要介紹了Python+OpenCV實現(xiàn)圖像融合的原理及代碼,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-12-12
  • Pycharm安裝第三方庫時Non-zero exit code錯誤解決辦法

    Pycharm安裝第三方庫時Non-zero exit code錯誤解決辦法

    這篇文章主要介紹了Pycharm安裝第三方庫時Non-zero exit code錯誤解決辦法,最好的解決辦法可以通過“Pycharm”左下角的“Terminal”,在pycharm內使用pip安裝,以安裝“requests”為例,需要的朋友可以參考下
    2023-01-01
  • Python實現(xiàn)刪除重復視頻文件的方法詳解

    Python實現(xiàn)刪除重復視頻文件的方法詳解

    這篇文章主要為大家詳細介紹了如何利用Python實現(xiàn)刪除重復視頻文件功能,文中的示例代碼講解詳細,對我們學習Python有一定幫助,需要的可以參考一下
    2022-10-10
  • Python中實現(xiàn)三目運算的方法

    Python中實現(xiàn)三目運算的方法

    這篇文章主要介紹了Python中實現(xiàn)三目運算的方法,本文用and/or 運算符模擬實現(xiàn)三目運算,需要的朋友可以參考下
    2015-06-06
  • python使用property完成數(shù)據(jù)隱藏封裝與校驗

    python使用property完成數(shù)據(jù)隱藏封裝與校驗

    這篇文章主要為大家詳細介紹了python使用property完成數(shù)據(jù)隱藏封裝與校驗,實現(xiàn)安全修改,文中的示例代碼講解詳細,希望對大家有所幫助
    2024-11-11
  • Python使用Altair創(chuàng)建交互式數(shù)據(jù)可視化的操作指南

    Python使用Altair創(chuàng)建交互式數(shù)據(jù)可視化的操作指南

    Altair 是一個基于 Vega-Lite 的 Python 數(shù)據(jù)可視化庫,它旨在簡化數(shù)據(jù)可視化的創(chuàng)建過程,尤其適用于統(tǒng)計圖表的生成,Altair 強調聲明式編碼方式,通過簡單的語法,用戶能夠快速創(chuàng)建復雜的交互式圖表,本文將介紹 Altair 的基礎用法、常見圖表類型,需要的朋友可以參考下
    2024-12-12
  • python第三方異步日志庫loguru簡介

    python第三方異步日志庫loguru簡介

    在編寫調試Python代碼過程中,我們經常需要記錄日志,通常我們會采用python自帶的內置標準庫logging,但是使用該庫,配置較為繁瑣。為了提升編程效率,本文重點介紹最近發(fā)現(xiàn)的一個寶藏第三方日志庫Loguru,感興趣的朋友一起看看吧
    2022-12-12

最新評論

眉山市| 阳春市| 股票| 清水河县| 厦门市| 桐柏县| 合水县| 富宁县| 兴海县| 正安县| 印江| 宁波市| 通海县| 商河县| 昌宁县| 天峻县| 开封市| 商南县| 保靖县| 航空| 绥芬河市| 土默特左旗| 湟源县| 塔城市| 信宜市| 长岛县| 金阳县| 莲花县| 汝城县| 周口市| 宜春市| 霍邱县| 陇西县| 海阳市| 湟中县| 高邮市| 吴桥县| 旺苍县| 康马县| 崇阳县| 南木林县|