Mysql

禁用 InnoDB 死鎖檢測

  • July 16, 2018

我想禁用 InnoDB 死鎖檢測和自動回滾,根據我們喜歡依賴的要求innodb_lock_wait_timeout(因為高並發)。

鎖定等待超時值在啟用(預設值)時不適用於死鎖, innodb_deadlock_detect因為 InnoDB 會立即檢測到死鎖並回滾其中一個死鎖事務。禁用時innodb_deadlock_detect,InnoDB 依賴於innodb_lock_wait_timeout事務回滾

$$ … $$

我們如何在 MySQL 5.7.13 中實現上述功能?我找不到任何變數innodb_deadlock_detect

是的,你可以做到。一定要保持innodb_lock_wait_timeout合理的低,例如 2 秒。持續 2 秒的死鎖是完全無害的,如果它們很少見(而且通常非常罕見)。提醒開發者避免長事務,避免外鍵ON ... CASCADE(因為它們傳播鎖,更容易產生死鎖)。

當然,我假設您可以為這些超時保持一個非常低的值。但是你可以嗎?我不知道您的工作量,但例如,一條語句可能每小時將某些行鎖定 10 秒。在這種情況下,你能負擔得起低超時嗎?如果不是,那麼我上面寫的所有內容都不適用於您。

即使有可能,也可能不明智。

每次發生可能的死鎖時,您都會將其變成一個連接,佔用一些資源 50 秒。對於您的“重度並發”,這可能會導致“連接不足”。在這一點上,沒有人做任何事情。

相反,讓我們討論一個有時會死鎖的常見事務。(您可能可以通過 擷取一個SHOW ENGINE=INNODB STATUS;。)這可能是減少死鎖頻率和/或加速事務的簡單方法。或者可以將多個事務合併為一個,從而減少成本。

同時,我認為這就是您所指的?

—– 2016-09-12 8.0.0 開發里程碑和 2016-09-06 5.7.15 通用可用性 – 添加或更改功能 – InnoDB —–

新的動態配置選項innodb_deadlock_detect可用於禁用死鎖檢測。在高並發系統上,當多個執行緒等待同一個鎖時,死鎖檢測會導致速度變慢。有時,禁用死鎖檢測並在發生死鎖時依靠innodb_lock_wait_timeout設置進行事務回滾可能更有效。(錯誤號 23477773)

引用自:https://dba.stackexchange.com/questions/186407