以下從死鎖檢測、死鎖避免、死鎖解決3個方面來探討如何對MySQL死鎖問題進行性能調優(yōu)。
死鎖檢測
通過SQL語句查詢鎖表相關信息:
(1)查詢表打開情況
SHOW OPEN TABLES WHERE IN_USE> 0
- 1
(2)查詢鎖情況列表
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS
- 1
(3)查詢鎖等待信息,其中blocking_lock_id是當前事務在等待的事務
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS
- 1
(4)查詢死鎖日志
SHOW ENGINE INNODB STATUS
1
這條語句只能顯示最新的一條死鎖,無法完全捕獲到系統(tǒng)發(fā)生的所有死鎖信息。
如果想要記錄所有的死鎖日志,需要打開innodb_print_all_deadlocks參數(shù),將所有的死鎖日志記錄到errorlog中。
(5)查詢鎖等待時間
SHOW STATUS LIKE '%lock%'
- 1
死鎖避免
當有死鎖發(fā)生時,通常是由于項目的程序中出現(xiàn)了冗長的事務,或是由于隔離級別設置的不合適等。
我們需要在事務使用中注意以下幾點:
(1)盡量保持事務的短小精悍,做出一系列關聯(lián)的更新操作后立即提交事務,以降低死鎖的可能性。特別是不要讓有關聯(lián)的MySQL會話長時間掛起未提交的事務。
(2)建議使用更低的隔離級別,如READ COMMITTED。
(3)在同一事務內修改多張表,或一張表內的不同行時,每次以相同的順序執(zhí)行操作。以便讓事務形成清晰的鎖操作隊列而規(guī)避死鎖。
死鎖解決
MySQL數(shù)據(jù)庫通過死鎖檢測(innodb_deadlock_detect)和死鎖超時時間(innodb_lock_wait_timeout)這兩個參數(shù)來進行死鎖解決。
死鎖檢測(innodb_deadlock_detect):在MySQL 8.0中,增加了一個新的動態(tài)變量innodb_deadlock_detect,用來控制InnoDB是否執(zhí)行死鎖檢測。
該參數(shù)的默認值為ON,即打開死鎖檢測。開啟后InnoDB在加鎖的時候會檢測加鎖后是否會造成死鎖,如果會加鎖,就回滾代價最小的那一個事務。
死鎖超時時間(innodb_lock_wait_timeout):這個參數(shù)可以用來處理檢測不出來的死鎖,或是避免長時間等待較長的事務的情況。
對于高并發(fā)的系統(tǒng),當大量線程等待同一個鎖時,死鎖檢測可能會導致性能的下降。
此時,如果禁用死鎖檢測,而改為依靠參數(shù)innodb_lock_wait_timeout來釋放長時間占用鎖資源的事務可能會更加高效。
也就是說,在確認死鎖檢測功能影響了系統(tǒng)的性能并且禁用死鎖檢測不會帶來負面影響時,可以嘗試關閉innodb_deadlock_detect選項。
另外,如果禁用了InnoDB死鎖檢測,需要及時調整參數(shù)innodb_lock_wait_timeout的值,以滿足實際的需求。
總結:
感謝每一個認真閱讀我文章的人!??!
作為一位過來人也是希望大家少走一些彎路,如果你不想再體驗一次學習時找不到資料,沒人解答問題,堅持幾天便放棄的感受的話,在這里我給大家分享一些自動化測試的學習資源,希望能給你前進的路上帶來幫助
軟件測試面試文檔
我們學習必然是為了找到高薪的工作,下面這些面試題是來自阿里、騰訊、字節(jié)等一線互聯(lián)網大廠最新的面試資料,并且有字節(jié)大佬給出了權威的解答,刷完這一套面試資料相信大家都能找到滿意的工作
?文章來源:http://www.zghlxwxcb.cn/news/detail-798117.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-798117.html
到了這里,關于MySQL性能測試及調優(yōu)中的死鎖處理方法的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!