1. 程式人生 > >減少InnoDB死鎖發生的方法有什麽?MySQL學習

減少InnoDB死鎖發生的方法有什麽?MySQL學習

MySQL數據庫 數據庫管理員 數據庫工程師 北京MySQL

  死鎖的情況發生在不同的的事務相互之間擁有對方需要的鎖,而導致相互一直無限等待。死鎖可能發生在不同的事務都會對多個相同的表和相同的行上施加鎖,但事務對表的操作順序不相同。


  為了減少死鎖的發生,要避免使用lock table語句,要盡量讓修改數據的範圍盡可能的小和快速;當不同的事務要修改多個表或者大量數據時,盡可能的保證修改的順序在事務之間要一致。默認情況下InnoDB下的死鎖自動偵測功能是開啟的,當InnoDB發現死鎖時,會將其中的一個事務作為犧牲品回滾。

  通過innodb_lock_wait_timeout參數配置自動偵測功能是否開啟,如果關閉的話,InnoDB就會使用innodb_lock_wait_timeout參數來自動回滾等待足夠時間的事務。可以通過show engine innodb status語句查看最後一次發生死鎖的情況。

  InnoDB死鎖檢測和回滾?默認情況下死鎖檢測功能是開啟的,當死鎖發生時InnoDB會自動檢測到並犧牲其中的一個或者幾個事務,以便讓其他的事務繼續執行下去。InnoDB選擇犧牲的事務往往是代價比較小的事務,其代價計算是根據事務insert,update, delete的數據行規模決定。如果事務中的某個語句因為錯誤而回滾,則這個語句上的鎖可能還會保留,是因為InnoDB僅會存儲行鎖信息,而不會存儲行鎖是由事務中的哪個語句產生的。如果在一個事務中,select語句調用了函數,而函數中的某個語句執行失敗,則那個語句會回滾,如果在整個事務結束時執行rollback,則整個事務回滾。可以通過innodb_deadlock_detect 參數關閉死鎖檢測功能,而僅僅用innodb_lock_wait_timeout的功能來釋放鎖等待 。


  那麽,減少死鎖發生的方法有什麽呢?

  在事務性數據庫中,死鎖是個經典的問題,但只要發生的頻率不高則死鎖問題不需要太過擔心。查看死鎖的方法有兩種:1.通過show engine innodb status命令可以查看最後一個死鎖的情況。2.通過innodb_print_all_deadlocks參數配置可以將所有死鎖的信息都打印到MySQL的錯誤日誌中。

  減少死鎖發生的方法:1.盡可能的保持事務小型化,減少事務執行的時間可以減少發生影響的概率;2.及時執行commit或者rollback,來盡快的釋放鎖;3.可以選用較低的隔離級別,比如如果要使用select...for update和select...lock in share mode語句時可以使用讀取提交數據隔離級別;4.當要訪問多個表數據或者要訪問相同表的不同行集合時,盡可能的保證每次訪問的順序是相同的。比如可以將多個語句封裝在存儲過程中,通過調用同一個存儲過程的方法可以減少死鎖的發生。


  互聯網企業大多用的數據庫是MySQL的,想要眾多的IT工作者中脫穎而出,就需要擁有高深的技術,學習增值是必不可少的。學習之路,是貴在堅持的。老男孩教育MySQL DBA課程,幾經更新課程,杜絕紙上談兵,全企業真實案例結合理論授課,想深入的學習MySQL DBA的知識,可以關註下老男孩教育。


減少InnoDB死鎖發生的方法有什麽?MySQL學習