天天看點

一次mysql事務鎖問題記錄

現象:

Lock wait timeout exceeded; try restarting transaction

場景:在不同伺服器不同僚務内先後對同一個資料表進行插入、更新,資料庫出現被鎖情況

原因:mysql資料庫采用InnoDB模式,預設參數 innodb_lock_wait_timeout 設定鎖等待時間是50s,一旦資料庫鎖超過這個時間就會報錯

解決方法:

1、檢視資料庫目前的程序,看一下是否有正在執行的慢SQL記錄線程

show processlist;

2、檢視目前的事務

目前運作的所有事務

SELECT * FROM information_schema.INNODB_TRX;

目前出現的鎖

SELECT * FROM information_schema.INNODB_LOCKs;

鎖等待的對應關系

SELECT * FROM information_schema.INNODB_LOCK_waits;

解釋:檢視事務表INNODB_TRX,裡面是否有正在lock wait鎖定的事務線程,檢視ID是否在show processlist裡面的sleep線程中,如果是,證明這個sleep線程事務一直沒有commit或者rollback,而是卡住了,需手動kill掉,若要kill語句,一定要進行組内确認哈,避免影響其他業務