前言:
運營人員反映,有一單子提交卡住了,頁面一直沒有返回。
1,剛開始懷疑是應用服務器或者db壓力過高hang住了,馬上去check應用服務器以及db的負載,看起來都OK,蠻低的,應該不是DB性能問題。
2,最後去看下是否是表鎖住了,查看到有2個事務一直RUNNING,沒有結束。,
mysql> select * from INNODB_TRX\G;
3,通過trx_mysql_thread_id: 1662332的去查詢information_schema.processlist找到執行事務的客戶端請求的SQL線程
4,通過SQL線程,找到應用程序的IP地址以及端口10.2xx.3.xx:23452
5,找到工程之後,再去查看tomcat的應用報錯信息,如下:
--- Check the select ID, SHOP_NAME, SHOP_CLASSIFICATION_ID, LEGAL_PERSON, CORPORATION, SHOP_TEL, ADDRESS, ZIP_CODE, LEGAL_PERSON_MOBILE, STAT, AUTHENTICATE, CREDIT, LEVEL, SCORE, LICENSE_PATH, BUSSINESS_RANGE, MALL_ID, FLOOR, BIS_COMPANY, STORE_NO, MANAGER_NAME, MANAGER_TEL, BRIEF, LOGO, FAVOUR_NUM, HAS_WAREHOUSE, DESCRIPTION_FIT, SERVICE, SPEED, BACKGROUND, BIS_CONT_ID,BIS_SHOP_ID, CREATED_DATE, UPDATED_DATE,ENGLISH_PREF from SHOP where SHOP_NAME = ? .
6,現在很明顯了,應該是事務未提交,配合開發去check所有的java代碼,發現有2處地方,在Exception e裡面忘記寫rollback了。
} catch (SQLException e) {
}
總結:開發人員,寫數據庫事務的時候,記得在異常處理Exception的時候,別忘記了rollback。