事務操作時中斷導致鎖表
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 刪除就不在鎖表了。