溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2021-11-01 13:37:01 來(lái)源:億速云 閱讀:117 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“怎么排查與解決python編程項(xiàng)目中線上問題”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“怎么排查與解決python編程項(xiàng)目中線上問題”吧!

問題描述

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

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

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

問題分析

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

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

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

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

  • 悲觀鎖 通過 “select …… for update” 實(shí)現(xiàn),就是在更新表前先對(duì)這條記錄進(jìn)行上鎖,然后下面再執(zhí)行更新語(yǔ)句。不過這種方式有些太重,畢竟加鎖還是需要很大時(shí)間成本的,不符合業(yè)務(wù)的需要,直接pass掉。

  • 樂觀鎖 相對(duì)就要輕量很多,它的主要實(shí)現(xiàn)就是通過在表中多增加一個(gè)記錄版本的字段,比如 version 。然后每次查詢記錄要更新時(shí),where 后面都要加上 version=? ,這樣當(dāng)你查詢拿到 version 后,如果有其他會(huì)話更新了這個(gè)字段,那這個(gè) version 就會(huì)和你現(xiàn)在拿的不一樣,從而會(huì)使你這次的更新失效,需要重新獲取最新 version 后再次執(zhí)行 update 語(yǔ)句。

問題解決

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

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

感謝各位的閱讀,以上就是“怎么排查與解決python編程項(xiàng)目中線上問題”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)怎么排查與解決python編程項(xiàng)目中線上問題這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI