MySQL 鎖那些事

    • Q1 : MySQL有哪些鎖,功能是什么,如何項目中使用?
    • Q2 : 行鎖是如何實現的?什么情況下會使用行鎖?
    • Q3 : 四種事務隔離形式的行鎖有什么不一樣?
        • 讀未提交
        • 讀提交
        • 可重復讀
        • 串行
    • Q4 : MySQL 的讀寫都是怎樣加鎖的?
    • Q5 : 需要注意什么?

Q1 : MySQL有哪些鎖,功能是什么,如何項目中使用?

  1. 全局 - 鎖定全局(庫)的數據,所有寫全部阻塞,只能寫.
    • 只有做全庫邏輯備份才會用
  2. 表鎖 - 鎖定一個表的數據,避免數據更新時的并發問題
  3. 行鎖 - 鎖定某一行/一個區間(間隙)的數據,避免數據更新時的并發問題
    • 行鎖是通過索引實現的,如果沒有索引,那么將會使用表鎖.

Q2 : 行鎖是如何實現的?什么情況下會使用行鎖?

  • MySQL 如何加表鎖:
    • 直接在整個表上加鎖,限制全表的讀寫訪問(鎖全表)

那么行鎖是如何工作的呢?

行鎖是通過索引實現的,主要分為兩個階段

  • 二級索引(間隙/臨建)加鎖并命中數據(主鍵 id)

    • 加鎖方式: 先根據邊界條件或者等值條件命中情況決定加鎖的范圍
      • 沒命中: 索引無法命中不存在的 key,但是要避免數據在(事務)執行期間新數據的加入導致數據混亂問題,就會在未命中前后 key 區間加間隙鎖,保證執行期間沒有數據插入
      • 其他: 如果鎖范圍查詢就會對查詢范圍進行加鎖,在結合剛剛的未命中區間,就是二級索引加鎖的區間
    • 作用: 限制區間的數據插入,避免區間內數據的插入導致結果錯誤問題
  • 主鍵索引加鎖

    • 根據上面二級索引命中的主鍵 id,對每個 id 的數據行進行加鎖
    • 作用: 避免事務執行期間數據被修改

Q3 : 四種事務隔離形式的行鎖有什么不一樣?

讀未提交

有的人說讀提交不會顯示加鎖,我覺得不加鎖不科學,不加鎖百分百會出現讀寫并發沖突問題,一定會報錯;
但是 MySQL 不會做一個有問題的東西給大家用,那為什么讀未提交不會阻塞其他事務,我想只有一個解釋鎖的生命周期(持有時間)

  • 鎖持有時間是任務結束(并不是事務結束),不會加間隙鎖
  • 優點: 鎖持有時間短,對其他事務影響小
  • 缺點: 臟讀問題
讀提交
  • 鎖的生命周期鎖整個事務,不會加間隙鎖
  • 優點: 沒有間隙鎖,對其他事務(在間隙的數據插入)性能影響小
  • 缺點: 數據幻讀問題
    (思考: 有鎖的話讀提交還有不可重復讀的問題嗎?)
可重復讀
  • 鎖的生命周期鎖整個事務,會加間隙鎖
  • 優點: 避免數據幻讀
  • 缺點: 略微降低數據寫入的性能
串行
  • 最嚴格的隔離級別,它通過加 范圍鎖 或 表鎖 來確保事務之間沒有沖突,所有讀取的數據都必須是其他事務已提交的數據。
  • 由于避免了幻讀,它會在 查詢范圍 上加 間隙鎖 或 表鎖,防止其他事務在查詢范圍內插入或修改數據。
    (我覺得串行不需要鎖,單線程的執行事務就沒有并發問題了呀,為什么需要鎖?搞不懂)

Q4 : MySQL 的讀寫都是怎樣加鎖的?

  • MySQL 的普通查詢是不會加鎖的,而是通過 mvcc 去進行多版本并發控制

  • MySQL 寫是通過鎖控制的,具體鎖的程度根據索引情況與隔離程度而定

Q5 : 需要注意什么?

  • 沒有索引鎖全表

行鎖只有索引的條件下才會生效,沒有索引會鎖全表,造成其他線程阻塞,連接大量堆積,嚴重影響性能.

沒有索引的查詢與更新數據在并發情況下表現更差.

索引不僅會減少磁盤 io 的次數加快數據的查詢,還可以提高并發情況下的讀寫性能表現.

參考:
https://www.xiaolincoding.com/mysql/lock/how_to_lock.html#%E5%94%AF%E4%B8%80%E7%B4%A2%E5%BC%95%E8%8C%83%E5%9B%B4%E6%9F%A5%E8%AF%A2
https://juejin.cn/post/6931752749545553933

https://blog.csdn.net/weixin_43994761/article/details/132250415
https://blog.unclezs.com/pages/180d74/#%E7%AE%80%E4%BB%8B

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64825.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64825.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64825.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

國產文本編輯器EverEdit - 批量轉碼轉換行符

1 批量轉碼&轉換行符 1.1 應用場景 如果用戶批量在Windows編輯文件,要上傳到異構系統,如:Linux,則需要批量轉換編碼和換行符,此時可以使用EverEdit的批量轉碼功能。 1.2 使用方法 選擇主菜單文檔 -> 批量轉碼…

Java實現下載excel模板,并實現自定義下拉框

GetMapping("excel/download")ApiOperation(value "模板下載")public void getUserRecordTemplate(HttpServletResponse response, HttpServletRequest request) throws IOException {OutputStream outputStream response.getOutputStream();InputStream…

成立一家無人機培訓機構需要哪些基礎配置

成立一家無人機培訓機構,需要一系列基礎配置來確保教學質量、學員安全以及機構的正常運營。以下是根據公開發布的信息整理出的關鍵基礎配置: 一、場地配置 1. 飛行場:提供一個安全、寬敞的室外飛行環境,面積最好大于三千平米&…

交換機性能詳解

1. 背板帶寬 只有模塊化交換機(擁有可擴展插槽,可靈活改變端口數量)才有這個概念,固定端換機是沒有這個概念的。并且固定端換機的背板容量和交換容量大小是相等的。 背板帶寬是交換機的總數據處理能力,由硬件架構設…

讀“將計算性能調高到極致的基點秘訣”的嘗試

看到一篇文章,說最近閱讀LAMMPS源碼,悟出了很多道理。在計算性能優化這塊,源代碼作者很多寫法我最初不以為意,后來發現是作者有意為之,就是為了把計算性能優化到極致。做計算仿真軟件,也特別需要注意這些吧…

Gitea代碼倉服務搭建

特點與優勢 輕量級:Gitea是一個輕量級的Git服務,提供了快速、穩定的代碼托管和協作開發環境。它資源占用低,適合在資源受限的環境中運行。易于安裝和部署:Gitea提供了簡單易用的安裝和部署方式,支持多種安裝方式,包括二進制文件、Docker容器等,并提供了詳細的文檔和配置…

leetcode hot 小偷

class Solution(object):def rob(self, nums):""":type nums: List[int]:rtype: int"""# 使用動態規劃,把之前的給保存起來ans[0,nums[-1]]for i in range(1,len(nums)):ans.append(max(ans[-1],ans[-2]nums[-1*i-1]))return ans[-1]…

端口被占用

端口8080被占用 哈哈哈,我是因為后端項目跑錯了,兩個項目后端名稱太像了; (1)netstat -aon | findstr 8080,找到占用8080端口的進程號,獲取對應的進程號pid; (2&#…

文件本地和OSS上傳

這里寫目錄標題 前端傳出文件后端本地存儲阿里云OSS存儲上傳Demo實現上傳ConfigurationProperties 前端傳出文件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>上傳文件</title> </head&g…

[人工智能] 結合最新技術:Transformer、CLIP與邊緣計算在提高人臉識別準確率中的應用

隨著人工智能的快速發展&#xff0c;特別是深度學習和自然語言處理領域的革命性技術&#xff0c;越來越多的前沿技術被應用于人臉識別中。Transformer架構、CLIP模型以及邊緣計算的結合&#xff0c;正成為提升人臉識別準確率和應用效能的關鍵技術路徑。特別是在多樣化場景下&am…

Python的*args和**kwargs

參考 總結&#xff1a; &#xff08;1&#xff09;*args用于在函數中處理傳遞的位置參數序列&#xff1b; &#xff08;2&#xff09;**kwargs則用于處理傳遞的關鍵字參數字典。 &#xff08;3&#xff09;示例&#xff1a; def complex_function(first, *args, **kwargs)…

Vue3 + ElementPlus動態合并數據相同的單元格(超級詳細版)

最近的新項目有個需求需要合并單元列表。ElementPlus 的 Table 提供了合并行或列的方法&#xff0c;可以參考一下https://element-plus.org/zh-CN/component/table.html 但項目中&#xff0c;后臺數據返回格式和指定合并是動態且沒有規律的&#xff0c;Element 的示例過于簡單&…

免費又開源:企業級物聯網平臺的新選擇 ThingsPanel

在開源領域&#xff0c;選擇合適的開源協議是開發者和企業能否充分利用平臺的關鍵。ThingsPanel&#xff0c;作為一個專注于物聯網的開源平臺&#xff0c;近日將協議從 AGPLv3 改為更開放的 Apache 2.0。這一改變對開發者和用戶意味著什么&#xff1f; 為什么協議要從 AGPLv3 轉…

C# 設計模式(結構型模式):代理模式

C# 設計模式&#xff08;結構型模式&#xff09;&#xff1a;代理模式 在軟件開發中&#xff0c;有時我們需要通過某種方式間接地訪問一個對象&#xff0c;這時就可以使用代理模式&#xff08;Proxy Pattern&#xff09;。代理模式通過引入一個代理對象來控制對目標對象的訪問…

關于AI面試系統2025年趨勢評估!

在快速發展的科技浪潮中&#xff0c;AI技術正以前所未有的速度滲透到各行各業。企業招聘領域&#xff0c;作為人才選拔的關鍵環節&#xff0c;也不例外地迎來了AI面試系統的廣泛應用和持續創新。2025年&#xff0c;AI面試系統不僅成為企業招聘的主流工具&#xff0c;更在智能化…

MySQL 01 02 章——數據庫概述與MySQL安裝篇

一、數據庫概述 &#xff08;1&#xff09;為什么要使用數據庫 數據庫可以實現持久化&#xff0c;什么是持久化&#xff1a;數據持久化意味著將內存中的數據保存到硬盤上加以“固化”持久化的主要作用是&#xff1a;將內存中的數據存儲在關系型數據庫中&#xff0c;當然也可以…

Linux 揮別 WinXP 時代協議,USB RNDIS 即將退場

IT之家 1 月 2 日消息&#xff0c;Linux 基金會研究員 Greg Kroah-Hartman 計劃在 Linux 內核中&#xff0c;徹底移除 USB RNDIS 協議驅動。 IT之家查詢公開資料&#xff0c;USB RNDIS 是一種遠程網絡驅動接口規范&#xff0c;將 USB 設備模擬成網卡&#xff0c;從而在計算機和…

Vue3 組件

文章目錄 Vue3 組件概述根組件定義和使用組件樣式控制全局樣式局部樣式深度樣式 Vue3 組件 概述 組件允許我們將 UI 劃分為獨立的、可重用的部分&#xff0c;并且可以對每個部分進行單獨的思考。在實際應用中&#xff0c;組件常常被組織成層層嵌套的樹狀結構&#xff1a; 根…

怎么在家訪問公司服務器?

在日常工作中&#xff0c;特別是對信息技術從業者而言&#xff0c;工作往往離不開公司的服務器。他們需要定期訪問服務器&#xff0c;獲取一些關鍵的機密文件或數據。如果您在家辦公&#xff0c;并且需要處理未完成的任務&#xff0c;同時需要從公司服務器獲取所需的數據&#…

AI 自動化編程對編程教育的影響

AI 自動化編程的未來 引言 你是否曾想過&#xff0c;未來的程序員需要掌握哪些技能呢&#xff1f;隨著人工智能的迅猛發展&#xff0c;特別是生成式AI工具的普及&#xff0c;編程的世界正在發生翻天覆地的變化。編程教育也在這種環境下進行著深刻的轉型。那么&#xff0c;AI …