問題描述
當一個串連會話等待另外一個會話持有的互斥行鎖時,就會發生行鎖等待情況,行鎖等待逾時的報錯如下。
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
問題原因
通常情況下,持有該互斥行鎖的會話會迅速的執行完相關操作並釋放掉持有的互斥鎖(事務提交或者復原),然後等待的會話在行鎖等待逾時時間內獲得該互斥行鎖,進行下一步操作。但在某些情況下,比如一個執行個體未感知到的來自用戶端應用的資料庫會話中斷,持有該互斥行鎖的會話長時間不釋放該互斥行鎖,此時如果有其他會話申請該互斥行鎖,則會導致大量的行鎖等待與行鎖等待逾時。
解決方案
本文提供的檢查和處理方法,僅當正在發生行鎖等待的情況下才成立。因為RDS MySQL行鎖等待預設逾時時間為50秒,通常情況下不容易觀察到行鎖等待的現場,可以通過將innodb_lock_wait_timeout參數設定為較大值來複現問題,但是生產環境不推薦使用過大的innodb_lock_wait_timeout參數值。
- 通過DMS登入RDS資料庫。
- 請您執行以下操作,查看存在當前正在執行的事務和等待鎖的事務。
- 執行以下SQL語句,查看正在執行的事務。
SELECT * FROM information_schema.INNODB_TRX;
- 執行以下SQL語句,查看等待鎖的事務。
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
- 執行以下SQL語句,查看正在鎖的事務。
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
- 執行以下SQL語句,查看正在執行的事務。
- 對於標識為Blocker的會話,即持有鎖阻塞其他會話的DML操作,導致行鎖等待和行鎖等待逾時,確認可以接受其對應的交易回復的情況下,可以將其終止。
- 如果您還是無法解決問題,請參見鎖阻塞,通過鎖阻塞統計頁面快速定位造成長時間阻塞的會話及其詳細資料。
適用於
雲資料庫RDS MySQL版