備份數據庫,全局鎖
如果全部使用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:加鎖的基本單位是 next-key lock。next-key lock 是前開後閉區間。
- 原則 2:查找過程中訪問到的對象纔會加鎖。
- 優化 1:索引上的等值查詢,給唯一索引加鎖的時候,next-key lock 退化爲行鎖。
- 優化 2:索引上的等值查詢,向右遍歷時且最後一個值不滿足等值條件的時候,next-key lock 退化爲間隙鎖。
- 一個 bug:唯一索引上的範圍查詢會訪問到不滿足條件的第一個值爲止。