網站首頁 編程語言 正文
一.什么是間隙鎖?
間隙鎖(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
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-12-25 sql中的if和else使用及說明_MsSql
- 2022-12-27 Android?Compose狀態改變動畫animateXxxAsState使用詳解_Android
- 2022-06-18 C#讀寫Config配置文件案例_C#教程
- 2022-02-07 SecureCRT連Linux服務器,提示The remote system refused the
- 2024-04-04 jQuery實現ajax語法,post請求發送數組對象(jquery)
- 2023-11-22 Docker常用命令、指令
- 2022-03-26 C語言宏定義#define的使用_C 語言
- 2022-07-28 numpy?array找出符合條件的數并賦值的示例代碼_python
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支