MySQL行鎖及其性能優化

MySQL行鎖及其性能優化

行鎖

  行鎖針對數據表中行記錄的鎖,需要存儲引擎支持,MyISAM不支持,InooDB支持, 在InnoDB事務中,行鎖在需要時才加上,但並不是不需要了就立刻釋放,而是要等到事務結束時才釋放,所以如果你的事務中需要鎖多個行,要把最可能造成鎖衝突、最可能影響併發度的鎖儘量往後放,以減少對性能的損耗。

死鎖與死鎖檢測

  MySQL中處理死鎖有兩種不同的策略:
   1.直接進入等待,直到超時。這個超時時間可以通過參數innodb_lock_wait_timeout來設置。這個,的缺點在於,超時時間默認爲50s,這對於大多數業務是不可容忍的,如果將這個時間修改的更小一些(如1s)則會發生本應等待鎖處理的線程直接超時失敗的問題,這個值很難去進行精準的控制。
  2.發起死鎖檢測,發現死鎖後,主動回滾死鎖鏈條中的某一個事務,讓其他事務得以繼續執行。將參數innodb_deadlock_detect設置爲on,表示開啓這個邏輯。這種策略相對較好,但是檢測死鎖需要耗費CPU資源,在併發數量大的情況也不是很好,可以在中間件或MySQL源碼進行改造,對於相同行的更新,在進入引擎之前排隊,避免在InnoDB內部有大量的死鎖檢測工作,也可以人爲的將數據分散存儲,類似於分表。

參考文獻

MySQL實戰45講

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章