1. 程式人生 > >mysql的InnoDB行鎖的一點反思

mysql的InnoDB行鎖的一點反思

行鎖 解決 統計 發現 今天 int 運營 innodb 應用場景

剛參加工作時,遇到的mysql死鎖的問題。具體情況如下:

網頁有個統計訪問次數功能,然後這個次數num是int類型,網頁每次被訪問一次就增1,然後運營在跑批量任務的時候,造成數據量這個字段死鎖了。然後DBA就查詢造成死鎖的原因,最後發現是我的代碼造成的死鎖,然後這個鍋,我接下了。這個問題怎麽解決的,我一直沒有察覺到,因為他們沒有要求修改代碼。後來我一直在思考這個問題,具體是什麽原因引起的死鎖。由於無法重現當時的應用場景和各種服務配置,我也無法深究這個問題。後來只能認真的研究mysql的鎖和java的並發控制。

N久沒有動筆寫文字了,表達還是有點問題,等我理清思路後,再詳細寫寫這方面的文字,今天就簡單的寫一下mysql關於innoDb行鎖要註意的兩個地方,還有其他很多需要的地方,這裏只簡單記錄一下,只能叫簡單記錄。

先說一下,innoDB行鎖的現實方式,它是通過給索引上的索引項加鎖來實現的。這就決定了行級鎖使用的前提是通過索引條件檢索數據,否則,innoDB將使用表級鎖。第二點要說的即使在條件中使用了索引字段,但是是否使用索引來檢索數據是由mysql通過判斷不同執行計劃的代價來決定的,如果mysql任務全表掃描效率更高,它就不會使用索引,這種情況下innoDB將使用表鎖,而不是行鎖。所以在分析mysql的鎖問題時,有時候需要使用explain來檢查SQL的執行計劃。


mysql的InnoDB行鎖的一點反思