一文了解MySQL性能測試及調(diào)優(yōu)中的死鎖處理方法,你還看不明白?
以下從死鎖檢測、死鎖避免、死鎖解決3個方面來探討如何對Mysql死鎖問題進行性能調(diào)優(yōu)。
死鎖檢測
通過SQL語句查詢鎖表相關(guān)信息:
(1)查詢表打開情況
SHOW OPEN TABLES WHERE IN_USE> 0
(2)查詢鎖情況列表
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS
(3)查詢鎖等待信息,其中blocking_lock_id是當前事務在等待的事務
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS
(4)查詢死鎖日志
SHOW ENGINE INNODB STATUS
這條語句只能顯示最新的一條死鎖,無法完全捕獲到系統(tǒng)發(fā)生的所有死鎖信息。
如果想要記錄所有的死鎖日志,需要打開innodb_print_all_deadlocks參數(shù),將所有的死鎖日志記錄到errorlog中。
(5)查詢鎖等待時間
SHOW STATUS LIKE '%lock%'
死鎖避免
當有死鎖發(fā)生時,通常是由于項目的程序中出現(xiàn)了冗長的事務,或是由于隔離級別設置的不合適等。
我們需要在事務使用中注意以下幾點:
(1)盡量保持事務的短小精悍,做出一系列關(guān)聯(lián)的更新操作后立即提交事務,以降低死鎖的可能性。特別是不要讓有關(guān)聯(lián)的MySQL會話長時間掛起未提交的事務。
(2)建議使用更低的隔離級別,如READ COMMITTED。
(3)在同一事務內(nèi)修改多張表,或一張表內(nèi)的不同行時,每次以相同的順序執(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)的性能并且禁用死鎖檢測不會帶來負面影響時,可以嘗試關(guān)閉innodb_deadlock_detect選項。
另外,如果禁用了InnoDB死鎖檢測,需要及時調(diào)整參數(shù)innodb_lock_wait_timeout的值,以滿足實際的需求。
- - -猜你喜歡:
? 字節(jié)跳動測試崗面試掛在二面,我復盤總結(jié)了失敗原因,決定再戰(zhàn)一次
? 軟件測試人員必讀的經(jīng)典書籍(附電子書),前阿里大佬給我推薦…
? 自從學了這套框架,自動化+性能都搞定了
MySQL 應用性能調(diào)優(yōu) 數(shù)據(jù)庫 自動化測試
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。