應(yīng)用直接中斷連接導(dǎo)致數(shù)據(jù)被鎖(生產(chǎn)故障)
- 這是一個(gè)由應(yīng)用重啟連接直接而導(dǎo)致數(shù)據(jù)被鎖的問(wèn)題。
- 系統(tǒng)大致結(jié)構(gòu)

基本情況:
- 整個(gè)架構(gòu)為了統(tǒng)一管理db連接,共享連接。
- 應(yīng)用通過(guò)loadbalance連接db訪問(wèn)層。
- db訪問(wèn)層后端代理若干db。
- 應(yīng)用到loadbalance以mysql協(xié)議通信。
- db訪問(wèn)層到db以JDBC方式通信。
故障: 某些數(shù)據(jù)庫(kù)中的表數(shù)據(jù)相當(dāng)長(zhǎng)一段時(shí)間被鎖,導(dǎo)致應(yīng)用某些場(chǎng)景失敗。
故障分析:應(yīng)用開(kāi)啟一個(gè)事務(wù)的set autocommit=0命令是從app-lb-db訪問(wèn)層-db,期間如果某個(gè)事務(wù)還未執(zhí)行完,而app強(qiáng)行中斷連接,就會(huì)導(dǎo)致app-lb的連接斷開(kāi),而lb并不直接斷開(kāi)后端的連接,即lb-db訪問(wèn)層-db的連接不會(huì)斷,從而導(dǎo)致db不會(huì)發(fā)生回滾操作。而且此事務(wù)對(duì)某些記錄加了鎖,于是就會(huì)發(fā)生某些數(shù)據(jù)被鎖。直到db訪問(wèn)層檢測(cè)出該連接超過(guò)了idle時(shí)間才會(huì)關(guān)閉,并發(fā)送回滾命令給db。
解決問(wèn)題:
① lb在前端連接關(guān)閉時(shí)要同時(shí)關(guān)閉同會(huì)話的后端連接,并且db訪問(wèn)層要監(jiān)聽(tīng)lb的連接,一旦關(guān)閉則要做回滾操作。
②去掉lb,提供客戶(hù)端loadbalance,應(yīng)用一旦關(guān)閉連接db訪問(wèn)層也要關(guān)閉連接。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
您可能感興趣的文章:- MYSQL主從庫(kù)不同步故障一例解決方法
- 線上MYSQL同步報(bào)錯(cuò)故障處理方法總結(jié)(必看篇)
- MySQL下高可用故障轉(zhuǎn)移方案MHA的超級(jí)部署教程
- 一次MySQL慢查詢(xún)導(dǎo)致的故障
- MySQL復(fù)制的概述、安裝、故障、技巧、工具(火丁分享)
- 檢測(cè)MySQL的表的故障的方法
- mysql 無(wú)法聯(lián)接常見(jiàn)故障及原因分析
- MySQL故障切換筆記之應(yīng)用無(wú)感知設(shè)計(jì)詳解