innodb_lock_wait_timeout參數


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;    如果不是可以考慮情況配置

      

 

  

  


免責聲明!

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



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