這是一個由應用重新開機連接配接直接而導緻資料被鎖的問題。
系統大緻結構

基本情況:
整個架構為了統一管理db連接配接,共享連接配接。
應用通過loadbalance連接配接db通路層。
db通路層後端代理若幹db。
應用到loadbalance以mysql協定通信。
db通路層到db以JDBC方式通信。
故障: 某些資料庫中的表資料相當長一段時間被鎖,導緻應用某些場景失敗。
故障分析:應用開啟一個事務的set autocommit=0指令是從app-lb-db通路層-db,期間如果某個事務還未執行完,而app強行中斷連接配接,就會導緻app-lb的連接配接斷開,而lb并不直接斷開後端的連接配接,即lb-db通路層-db的連接配接不會斷,進而導緻db不會發生復原操作。而且此事務對某些記錄加了鎖,于是就會發生某些資料被鎖。直到db通路層檢測出該連接配接超過了idle時間才會關閉,并發送復原指令給db。
解決問題:
① lb在前端連接配接關閉時要同時關閉同會話的後端連接配接,并且db通路層要監聽lb的連接配接,一旦關閉則要做復原操作。
②去掉lb,提供用戶端loadbalance,應用一旦關閉連接配接db通路層也要關閉連接配接。
========廣告時間========
<a href="http://blog.csdn.net/wangyangzhizhou/article/details/74080321">為什麼寫《Tomcat核心設計剖析》</a>
=========================
歡迎關注: