數據庫遇到的問題——事務操作時中斷導致鎖表


事務操作時中斷導致鎖表

1.導致鎖表的原因
1.1首先是大前提
我們正常的框架在service層都會有事物控制,比如我一個service層的方法要執行更新兩張表,這兩個表只有同時更新成功才算成功,如果有一個異常,事務回滾。

1.2 我的操作

這是源代碼的部分,當debug到sysEleMaterialClassService.updateChildParentId();出現異常,然后在catch里我打了個斷點,看報錯信息。看完之后沒有走到 throw這個拋異常的方法,然后我就關閉了應用,修改代碼。等重啟后就發現表鎖了。
我這個操作就導致即沒有拋異常讓事務回滾,也沒有讓mybatis提交事務,但是表這是已經被鎖定,等着你提交后執行,就這么一直等着,始終沒有提交。 mybatis 對 jdbc 的代碼做過封裝,它的事務提交時手動的,所以我們每次要sqlSession.submit();而這一步應該是走完方法到controller層后才提交。我這里到service層就停了。

1.3 報錯信息

再次啟動程序還是能夠查詢,但是對update ,insert的操作已經執行報錯: Lock wait timeout exceeded; try restarting transaction

2.解決鎖表問題
2.1 先用這條命令查詢數據庫阻塞的進程

SELECT * FROM information_schema.innodb_trx 

得到的數據如下:


2.2
主要看箭頭指向的這幾個字段,如果有阻塞數據(不為0的就是阻塞的),找到后在根據下圖這個字段:try_mysql_thread_id 作為這條數據的主鍵id執行這個sql進行刪除: kill id ;(殺死對應id的進程).假設這里try_mysql_thread_id=277 的這條數據是鎖了。我們執行 kill 277 刪除就不在鎖表了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM