亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python編程項(xiàng)目中線上問(wèn)題排查與解決

 更新時(shí)間:2021年11月01日 11:38:15   作者:Python 技術(shù)  
因?yàn)闃I(yè)務(wù)上的設(shè)計(jì)存在問(wèn)題,導(dǎo)致數(shù)據(jù)庫(kù)表總是被鎖,而且是不定期的鎖定,導(dǎo)致服務(wù)器運(yùn)行異常,今天就來(lái)跟大家說(shuō)說(shuō)該如何避免這種問(wèn)題

文 | 極光

來(lái)源:Python 技術(shù)「ID: pythonall」

最近開(kāi)發(fā)中遇到個(gè)小問(wèn)題,因?yàn)闃I(yè)務(wù)上的設(shè)計(jì)存在問(wèn)題,導(dǎo)致數(shù)據(jù)庫(kù)表總是被鎖,而且是不定期的鎖定,導(dǎo)致服務(wù)器運(yùn)行異常,最后經(jīng)過(guò)排查原因是多線程同時(shí)更新同一表中同一條記錄導(dǎo)致問(wèn)題。今天就來(lái)跟大家說(shuō)說(shuō)該如何避免這種問(wèn)題。

問(wèn)題描述

最近因?yàn)楣緲I(yè)務(wù)需要,產(chǎn)品設(shè)計(jì)了一套業(yè)務(wù)系統(tǒng),據(jù)說(shuō)會(huì)有很多內(nèi)部和外部人員使用,拿到系統(tǒng)說(shuō)明我們研發(fā)部門拼命加班趕時(shí)間,經(jīng)歷了兩個(gè)月的后終于把系統(tǒng)上線運(yùn)行。

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

找到錯(cuò)誤問(wèn)題后我們就開(kāi)始一遍遍的翻日志,各種分析查找到底是什么原因?qū)е铝吮碛涗洷绘i。最后發(fā)現(xiàn)這個(gè)表的狀態(tài)字段,存在多個(gè)接口方法同時(shí)更新的情況,而且經(jīng)常是同時(shí)操作的。也就是數(shù)據(jù)庫(kù)中存在多個(gè)會(huì)話同時(shí)操作同一表中同一行記錄,從而導(dǎo)致表記錄被鎖。

問(wèn)題分析

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

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

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

通過(guò)這兩種方式就能解決問(wèn)題,不過(guò)選哪種比較好,我們來(lái)簡(jiǎn)單分析下:

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

問(wèn)題解決

好了,經(jīng)過(guò)以上分析,已經(jīng)有了比較清晰的解決思路,剩下就是碼代碼了:

    /**
     * 樂(lè)觀鎖更新
     * @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;
    }
 

總結(jié)

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

更多關(guān)于python線上問(wèn)題排查與解決的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 對(duì)numpy中array和asarray的區(qū)別詳解

    對(duì)numpy中array和asarray的區(qū)別詳解

    下面小編就為大家分享一篇對(duì)numpy中array和asarray的區(qū)別詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Python獲取昨天、今天、明天開(kāi)始、結(jié)束時(shí)間戳的方法

    Python獲取昨天、今天、明天開(kāi)始、結(jié)束時(shí)間戳的方法

    今天小編就為大家分享一篇Python獲取昨天、今天、明天開(kāi)始、結(jié)束時(shí)間戳的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • keras模型可視化,層可視化及kernel可視化實(shí)例

    keras模型可視化,層可視化及kernel可視化實(shí)例

    今天小編就為大家分享一篇keras模型可視化,層可視化及kernel可視化實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • python 日期操作類代碼

    python 日期操作類代碼

    這篇文章主要介紹了python 日期操作類代碼,里面涉及了python日期操作的一些基礎(chǔ)知識(shí),需要的朋友可以參考下
    2018-05-05
  • python中數(shù)字是否為可變類型

    python中數(shù)字是否為可變類型

    在本篇文章里小編給大家整理了關(guān)于python中數(shù)字是否為可變類型的相關(guān)文章內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-07-07
  • python實(shí)現(xiàn)快速排序的示例(二分法思想)

    python實(shí)現(xiàn)快速排序的示例(二分法思想)

    本篇文章主要介紹了python實(shí)現(xiàn)快速排序的示例(二分法思想),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • Python學(xué)習(xí)筆記之字典,元組,布爾類型和讀寫文件

    Python學(xué)習(xí)筆記之字典,元組,布爾類型和讀寫文件

    這篇文章主要為大家詳細(xì)介紹了Python的字典,元組,布爾類型和讀寫文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • Python 讀寫文件和file對(duì)象的方法(推薦)

    Python 讀寫文件和file對(duì)象的方法(推薦)

    下面小編就為大家?guī)?lái)一篇Python 讀寫文件和file對(duì)象的方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • python 列表降維的實(shí)例講解

    python 列表降維的實(shí)例講解

    今天小編就為大家分享一篇python 列表降維的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • Python3如何實(shí)現(xiàn)Win10桌面自動(dòng)切換

    Python3如何實(shí)現(xiàn)Win10桌面自動(dòng)切換

    這篇文章主要介紹了Python3如何實(shí)現(xiàn)Win10桌面自動(dòng)切換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08

最新評(píng)論