五月综合激情婷婷六月,日韩欧美国产一区不卡,他扒开我内裤强吻我下面视频 ,无套内射无矿码免费看黄,天天躁,日日躁,狠狠躁

新聞動態(tài)

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

發(fā)布日期:2021-12-16 15:39 | 文章來源:腳本之家

文 |極光

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

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

問題描述

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

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

找到錯誤問題后我們就開始一遍遍的翻日志,各種分析查找到底是什么原因?qū)е铝吮碛涗洷绘i。最后發(fā)現(xiàn)這個表的狀態(tài)字段,存在多個接口方法同時更新的情況,而且經(jīng)常是同時操作的。也就是數(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 語句。

問題解決

好了,經(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;
 }
 

總結(jié)

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

更多關(guān)于python線上問題排查與解決的資料請關(guān)注本站其它相關(guān)文章!

版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務

7x24全年不間斷在線

專屬顧問服務

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務熱線

關(guān)注
微信

關(guān)注官方微信
頂部