日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

間隙鎖(Gap Lock)

作者:Jothan Zhong 更新時間: 2024-01-12 編程語言

一.什么是間隙鎖?

間隙鎖(Gap Lock):當我們用范圍條件而不是相等條件索引數據,并請求共享或排他鎖時,InnoDB會給符合條件的已有數據記錄的索引項加鎖;對于鍵值在條件范圍內但并不存在的記錄,叫做“間隙(GAP)”。間隙鎖Gap Lock,左右都是開區間,間隙鎖+行鎖合稱next-key lock,每個 next-key lock 是前開后閉區間。間隙鎖和next-key lock的引入幫我們解決幻讀問題。

二.間隙鎖產生的條件

事務隔離級別為RR(可重復讀),間隙鎖是為了防止幻讀
執行delete/update/select for update操作,且where條件中索引未命中(命中加行鎖,沒有索引加表鎖)

三.間隙鎖的危害

因為Query執行過程中通過范圍查找的話,他會鎖定整個范圍內所有的索引鍵值,即使這個鍵值并不存在。間隙鎖有一個比較致命的弱點,就是當鎖定一個范圍鍵值之后,即使某些不存在的鍵值也會被無辜的鎖定,也造成在鎖定的時候無法插入鎖定鍵值范圍內的任何數據。在某些場景下這可能會對性能造成很大的危害。
間隙鎖的引入,雖然解決了幻讀的問題,但可能會導致同樣的語句鎖住更大的范圍,這其實是影響了并發度的。在數據庫參數中, 控制間隙鎖的參數是:innodb_locks_unsafe_for_binlog,這個參數默認值是OFF, 也就是啟用間隙鎖, 他是一個布爾值, 當值為true時表示disable間隙鎖。但這個參數會影響到主從復制及災難恢復, 這個防止間隙鎖的方法還尚待商量。

四.解決方案

①降低事務級別至讀已提交(不推薦)
②先判斷有無數據,有數據刪,無數據則不刪,因為刪除不存在的數據一定會加間隙鎖
③間隙鎖非互斥鎖,只針對寫鎖,只要兩個線程鎖定的區間有交叉就會出現死鎖。可以根據條件查出所有主鍵,根據主鍵刪除數據,這樣只會加行鎖而不是間隙鎖(推薦)
④你如果把隔離級別設置為讀提交的話,就沒有間隙鎖了。但同時,你要解決可能出現的數據和日志不一致問題,需要把 binlog 格式設置為 row。如果讀提交隔離級別夠用,也就是說,業務不需要可重復讀的保證,這樣考慮到讀提交下操作數據的鎖范圍更小(沒有間隙鎖),這個選擇是合理的。

原文鏈接:https://blog.csdn.net/qq_43985303/article/details/132354063

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新