佳木斯湛栽影视文化发展公司

主頁 > 知識(shí)庫 > DB2死鎖的解決過程全記錄

DB2死鎖的解決過程全記錄

熱門標(biāo)簽:網(wǎng)站排名優(yōu)化 地方門戶網(wǎng)站 百度競(jìng)價(jià)排名 Linux服務(wù)器 鐵路電話系統(tǒng) 呼叫中心市場(chǎng)需求 AI電銷 服務(wù)外包

生產(chǎn)環(huán)境里使用的數(shù)據(jù)庫是DB2。但是最近頻繁出現(xiàn)一個(gè)奇怪的死鎖現(xiàn)象:某一個(gè)select sql 語句總是會(huì)出現(xiàn)死鎖。

按照以往的經(jīng)驗(yàn),通常都是update/delete之類的更新sql語句會(huì)出現(xiàn)死鎖的問題。而且這個(gè) select sql 語句是一個(gè)很普通的sql,沒有任何大數(shù)據(jù)量的處理。

分析這個(gè)死鎖,有很多難以處理的地方。

1、因?yàn)樯a(chǎn)環(huán)境數(shù)據(jù)量大,我們無法把生產(chǎn)環(huán)境中關(guān)聯(lián)表的數(shù)據(jù)導(dǎo)入到測(cè)試環(huán)境。也就是說,無法模擬數(shù)據(jù)量。
2、沒有任何log輸出。因?yàn)樯a(chǎn)環(huán)境的log輸出級(jí)別是ERROR。
3、無法在生產(chǎn)環(huán)境進(jìn)行測(cè)試,因?yàn)榭蛻舨辉试S。
4、生產(chǎn)環(huán)境的數(shù)據(jù)庫無法開啟快照等功能。因?yàn)闀?huì)影響性能。

大家可以想象,在沒有快照等功能下,分析死鎖就只能靠分析代碼了。但是這個(gè)處理非常復(fù)雜,單憑分析代碼,沒有任何頭緒。
 
階段1:我們懷疑是數(shù)據(jù)量的原因
 
由于生產(chǎn)環(huán)境的數(shù)據(jù)量特別大,這個(gè)處理還有很多其他表的處理。所以我們懷疑是不是大數(shù)據(jù)量導(dǎo)致系統(tǒng)負(fù)荷過高,導(dǎo)致了死鎖?
于是我們?nèi)〉昧税l(fā)生死鎖時(shí)CPU,硬盤,網(wǎng)絡(luò)等等負(fù)載信息。沒有找到任何線索。
 
階段2:做一個(gè)測(cè)試程序,在測(cè)試環(huán)境中用多線程模擬多用戶去做這個(gè)處理。
 
為了能夠在開發(fā)環(huán)境再現(xiàn)出這個(gè)死鎖,我們做了一個(gè)多線程的測(cè)試程序,模擬多用戶運(yùn)行??上?,還是沒有再現(xiàn)出來。
 
階段3:分析測(cè)試環(huán)境數(shù)據(jù)庫和產(chǎn)品環(huán)境數(shù)據(jù)庫的差異
 
此時(shí)我們懷疑還是數(shù)據(jù)量導(dǎo)致的問題。于是我們盡可能的將開發(fā)環(huán)境的數(shù)據(jù)弄得和產(chǎn)品環(huán)境一樣多。
之后在運(yùn)行測(cè)試,還是沒有再現(xiàn)出來。
 
階段4:分析用戶的操作log
 
沒有任何辦法的情況下,我們只好分析用戶的操作log,希望從中找到一點(diǎn)線索。功夫不負(fù)有心人,我們發(fā)現(xiàn),當(dāng)兩個(gè)人同時(shí)
進(jìn)行這個(gè)操作的時(shí)候,基本都會(huì)發(fā)生死鎖。所以,我們判斷還是兩個(gè)人同時(shí)操作導(dǎo)致的問題。但是,為什么開發(fā)環(huán)境上模擬了
很多人的操作,卻沒有發(fā)生死鎖呢?
 
階段5:發(fā)現(xiàn)數(shù)據(jù)庫設(shè)置的問題
 
我們又修改了測(cè)試程序,將模擬的用戶數(shù)量提高,但是很不幸,仍然沒有再現(xiàn)這個(gè)問題。此時(shí)我們注意到了:是不是開發(fā)環(huán)境的
數(shù)據(jù)庫設(shè)置和產(chǎn)品環(huán)境的數(shù)據(jù)庫設(shè)置不同?我們對(duì)比了一下兩個(gè)數(shù)據(jù)庫的設(shè)置:發(fā)現(xiàn)好多參數(shù)不同。但是我們僅僅關(guān)注了和鎖有關(guān)
的設(shè)置,也就是包含 LOCK關(guān)鍵字的設(shè)置。
 
階段6:將測(cè)試環(huán)境數(shù)據(jù)庫和產(chǎn)品環(huán)境數(shù)據(jù)庫的設(shè)置保持一致
 
我們將所有和lock有關(guān)的設(shè)置都改成了和產(chǎn)品環(huán)境一直。但是仍然沒有再現(xiàn)這個(gè)死鎖。終于,一個(gè)人發(fā)現(xiàn),"cur_commit"這個(gè)設(shè)置
不同。于是查詢文檔,發(fā)現(xiàn)了 cur_commit的特點(diǎn)。
當(dāng) cur_commit = false的時(shí)候,下列情況會(huì)造成死鎖:
線程1插入數(shù)據(jù)A,然后線程2插入數(shù)據(jù)B。
在線程2還沒有提交事物之前,線程1查詢數(shù)據(jù)A,就會(huì)造成死鎖了。
開發(fā)環(huán)境中,cur_commit = true,所以我們一直也模擬不出來這個(gè)現(xiàn)象。
于是,我們把cur_commit也改成了 false。
 
階段7:使用測(cè)試程序去模擬
 
我們修改了測(cè)試程序,模擬上面兩個(gè)線程的操作,成功地再現(xiàn)了這個(gè)死鎖。錯(cuò)誤的log信息和產(chǎn)品環(huán)境上也是一致的。
 
階段8:使用畫面操作去模擬
 
然后我們修改了程序,使用畫面去操作,也成功地再現(xiàn)了這個(gè)死鎖。
 
解決方案:
 
解決方案很簡單,就是把查詢語句中的條件加為索引,就不會(huì)出現(xiàn)死鎖了。
由于這個(gè)表數(shù)據(jù)量不大,所以性能幾乎沒有任何影響。

您可能感興趣的文章:
  • 數(shù)據(jù)庫觸發(fā)器DB2和SqlServer有哪些區(qū)別
  • CentOS下DB2數(shù)據(jù)庫安裝過程詳解
  • db2數(shù)據(jù)庫常用操作命令大全
  • DB2新手使用的一些小筆記:新建實(shí)例、數(shù)據(jù)庫路徑不存在、客戶端連接 .
  • db2 導(dǎo)入導(dǎo)出單個(gè)表的操作詳解
  • DB2比較常用與實(shí)用sql語句總結(jié)
  • DB2 常用命令小結(jié)
  • DB2 常用命令速查(備忘)
  • DB2 日期和時(shí)間的函數(shù)應(yīng)用說明
  • 詳解DB2 sqlstate 57016 SQLCODE=-668 原因碼 "7"錯(cuò)誤的快速解決辦法

標(biāo)簽:衡水 銅川 崇左 黃山 湘潭 蘭州 湖南 仙桃

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《DB2死鎖的解決過程全記錄》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    枞阳县| 华容县| 息烽县| 乾安县| 兴宁市| 马山县| 修水县| 龙江县| 海淀区| 松潘县| 吉安市| 黑龙江省| 长子县| 刚察县| 潜山县| 昌邑市| 澳门| 安徽省| 连江县| 高淳县| 施秉县| 岳普湖县| 含山县| 前郭尔| 奇台县| 大城县| 土默特右旗| 剑阁县| 道真| 新和县| 海南省| 宁波市| 穆棱市| 满城县| 泾阳县| 会理县| 金门县| 盐亭县| 丰宁| 方正县| 松原市|