[MySQL實戰45講]MySQL筆記之數據庫鎖

備份數據庫,全局鎖

如果全部使用InnoDB引擎,那麼直接 mysqldump -single-transaction 即可

否則用FTWRL語句,即 flush table with read lock。

你發現你的應用程序裏有 lock tables 這樣的語句

表鎖一般是在數據庫引擎不支持行鎖的時候纔會被用到的。

要麼是你的系統現在還在用 MyISAM 這類不支持事務的引擎,那要安排升級換引擎

要麼是你的引擎升級了,但是代碼還沒升級。我見過這樣的情況,最後業務開發就是把 lock tables 和 unlock tables 改成 begin 和 commit,問題就解決了。

select for update

表示當前讀。RR事務普通select查詢只會查詢最早的view,此時其他事務的update不會被讀到

但是select for update則會把更新的update也讀到,讀取的是當前的數據,而不是RR事務的view數據。

Next-key lock

幻讀會導致語義被破壞和數據一致性被破壞兩個問題。

爲了解決幻讀,InnoDB引入了間隙鎖(Gap Lock)。間隙鎖,鎖的就是兩個值之間的空隙。比如表中有 6 個記錄,就會有 7 個間隙。

間隙鎖只會和insert操作產生衝突,其他都不會。

間隙鎖和行鎖合稱 next-key lock,每個 next-key lock 是前開後閉區間。

缺點:可能會導致同樣的語句鎖住更大的範圍,這其實是影響了併發度
的。

設計語句時需要多考慮間隙鎖,防止死鎖

加鎖規則

  1. 原則 1:加鎖的基本單位是 next-key lock。next-key lock 是前開後閉區間。
  2. 原則 2:查找過程中訪問到的對象纔會加鎖。
  3. 優化 1:索引上的等值查詢,給唯一索引加鎖的時候,next-key lock 退化爲行鎖。
  4. 優化 2:索引上的等值查詢,向右遍歷時且最後一個值不滿足等值條件的時候,next-key lock 退化爲間隙鎖。
  5. 一個 bug:唯一索引上的範圍查詢會訪問到不滿足條件的第一個值爲止。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章