1、參數查看
- 方法一:mysql> show variables like 'innodb_lock_wait_timeout';
- 方法二:直接查看my.cnf文件innodb_lock_wait_timeout參數值
2、參數配置
- 方法一:mysql> set global innodb_lock_wait_timeout=1; 重啟后會丟失使用my.cnf參數或默認值
- 方法二:直接修改my.cnf文件innodb_lock_wait_timeout參數值,但需要重啟實例生效
3、參數值意義
innodb_lock_wait_timeout integer GLOBAL | SESSION
InnoDB事務在放棄前等待行鎖的時間(秒)。innodb_lock_wait_timeout默認值為50秒。當有試圖訪問被另一行鎖定的行的事務InnoDB事務在發出以下錯誤:
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
當發生鎖等待超時時,將回滾當前語句 (而不是整個事務)。要回滾整個事務,請使用“innodb_rollback_on_timeout” 開啟值為:ON
對於高度交互式的應用程序或 OLTP 系統,您可能會降低該值,以便快速顯示用戶反饋,或者將更新放入隊列中以便稍后處理。對於長時間運行的后端操作,例如等待其他大型插入或更新操作完成的數據倉庫中的轉換步驟,您可能會增加此值。InnoDB _ lock _ wait _ timeout僅適用於 InnoDB 行鎖。MySQL 表鎖不會發生在 InnoDB 內部,並且此超時不適用於等待表鎖。鎖等待超時值不適用於死鎖,因為 InnoDB 會立即檢測到它們,並回滾其中一個死鎖事務。參見第 14.5.5.2 節,“死鎖檢測和回滾”。innodb _ lock _ wait _ time 可以在運行時使用 set GLOBAL 或 SET SESSION 語句設置。更改全局設置需要超級權限,並影響隨后連接的所有客戶端的操作。任何客戶端都可以更改 innodb _ lock _ wait _ 超時的會話設置,這只影響該客戶端。
4、外料
報錯: ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 的可能原因及解決方法
可能場景:
在同一事務內先后對同一條數據進行插入和更新操作;
多台服務器(web)或客戶端操作同一數據庫;
瞬時出現高並發現象;
原因:
在高並發的情況下,事務造成數據庫死鎖,后續操作超時拋出異常。
MySQL數據庫采用InnoDB模式,默認參數:innodb_lock_wait_timeout設置鎖等待的時間是50s,一旦數據庫鎖超過這個時間就會報錯。
解決方法:
a) 收集信息
查看有哪些線程正在執行:show processlist;
查看當前運行的所有事務:SELECT * FROM information_schema.INNODB_TRX;
其中trx_mysql_thread_id 與 show processlist;的 id 相對應
查看當前鎖定的事務:SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
查看當前等鎖的事務:SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
b) 根據收集的信息情況判斷需要kill 掉的線程
c) 另外關注事務是否自動提交:
mysql> show variables like 'autocommit';
mysql> set global autocommit='ON' 或 mysql> set global autocommit=1; 如果不是可以考慮情況配置