来源:https://www.cnblogs.com/zh-Note/archive/2023/06/04/17455256.html
-Advertisement-
Play Games

# **鎖** ## **概述** - **介紹** 鎖是電腦協調多個進程或線程併發訪問某一資源的機制。在資料庫中,除傳統的計算資源(CPU、RAM、I/O)的爭用以外,數據也是一種供許多用戶共用的資源。如何保證數據併發訪問的一致性、有效性是所有資料庫必須解決的一個問題,鎖衝突也是影響資料庫併發訪 ...


概述

  • 介紹

    鎖是電腦協調多個進程或線程併發訪問某一資源的機制。在資料庫中,除傳統的計算資源(CPU、RAM、I/O)的爭用以外,數據也是一種供許多用戶共用的資源。如何保證數據併發訪問的一致性、有效性是所有資料庫必須解決的一個問題,鎖衝突也是影響資料庫併發訪問性能的一個重要因素。從這個角度來說,鎖對資料庫而言顯得尤其重要,也更加複雜。

  • 分類

    MySQL中的鎖,按照鎖的粒度分,分為以下三類:

    1. 全局鎖:鎖定資料庫中的所有表。
    2. 表級鎖:每次操作鎖住整張表。
    3. 行級鎖:每次操作鎖住對應的行數據。

全局鎖

  • 介紹

    全局鎖就是對整個資料庫實例加鎖,加鎖後整個實例就處於只讀狀態,後續的DML的寫語句,DDL語句,以及更新操作的事務提交語句都將被阻塞。

    其典型的使用場景是做全庫的邏輯備份,對所有的表進行鎖定,從而獲取一致性視圖,保證數據的完整性。

  • 演示

  • 語法

    加鎖:flush tables with read lock;

    備份:mysqldump -u用戶名 -p密碼 資料庫名稱 > 備份文件的路徑註意mysqldump是MySQL提供的一個工具,不是SQL語句,所以不要在MySQL的命令行運行,直接在系統的命令行運行。

    釋放鎖:unlock tables;

  • 特點

    資料庫中加全局鎖,是一個比較重的操作,存在以下問題:

    1. 如果在主庫上備份 ,那麼在備份期間都不能執行更新,業務基本上就得停擺。
    2. 如果在從庫上備份,那麼在備份期間從庫不能執行主庫同步過來的二進位文件(binlog),會導致主從延遲。

    在InnoDB引擎中,我們可以在備份時加上參數 --single-transaction 參數來完成不加鎖的一致性數據備份。

    mysqldump --single-transaction -uxxx -pxxx 資料庫名 > 備份文件路徑

表級鎖

  • 介紹

    表級鎖,每次操作鎖住整張表。鎖定粒度大,發生鎖衝突的概率最高,併發度最低。應用在MyISAM、InnoDB、BDB等存儲引擎中。

    對於表級鎖,主要分為以下三類:

    1. 表鎖
    2. 元數據鎖(meta data lock,MDL)
    3. 意向鎖
  1. 表鎖

    對於表鎖,分為兩類:

    • 表共用讀鎖(read lock)
    • 表獨占寫鎖(write lock)

    語法:

    • 加鎖:lock tables 表名... read/write
    • 釋放鎖:unlock tables / 客戶端斷開連接

讀鎖不會阻塞其他客戶端的讀,但是會阻塞寫。寫鎖即會阻塞其他客戶端的讀,又會阻塞其他客戶端的寫。

  1. 元數據鎖(meta data lock,MDL)

    MDL加鎖過程是系統自動控制,無需顯式使用,在訪問一張表的時候會自動加上。MDL鎖主要作用是維護表元數據的數據一致性(這裡元數據可以理解為表結構),在表上有活動事務的時候,不可以對元數據進行寫入操作。為了避免DML與DDL衝突,保證讀寫的正確性。

    在MySQL5.5中引入了MDL,當對一張表進行增刪改查的時候,加MDL讀鎖(共用);當對錶結構進行變更操作的時候,加MDL寫鎖(排他)。

    對應SQL 元數據鎖類型 說明
    lock tables xxx read/write SHARED_READ_ONLY / SHARED_NO_READ_WRITE
    select、select...lock in share mode SHARED_READ 與SHARED_READ、SHARED_WRITE相容,與EXCLUSIVE互斥
    insert、update、delete、select ... for update SHARED_WRITE 與SHARED_READ、SHARED_WRITE相容,與EXCLUSIVE互斥
    alter table ... EXCLUSIVE 與其他的MDL都互斥

    查看元數據鎖:

    select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks;

  2. 意向鎖

    為了避免DML在執行時,加的行鎖與表鎖的衝突就,在InnoDB中引入了意向鎖,使得表鎖不用檢查每行數據是否加鎖,使用意向鎖來減少表鎖的檢查。

    1. 意向共用鎖(IS):由語句select ... lock in share mode 添加。與表鎖共用鎖(read)相容,與表鎖排他鎖(write)互斥。
    2. 意向排他鎖(IX):由insert、update、delete、select ... for update 添加。與表鎖共用鎖(read)及排他鎖(write)都互斥。意向鎖之間不會互斥。

    可以通過以下SQL語句,查看意向鎖及行鎖的加鎖情況:

    select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;

    彈幕筆記摘要:

    • 明顯寫鎖和誰都衝突,讀鎖和任何讀鎖都相容,很好理解因為都只讀;
    • 總的來說,意向鎖並不是真正意義上的鎖,只是一個記載鎖的數據結構,可以這麼理解,不要被它的名字騙了;
    • 要說意向鎖是鎖的話,那麼它算是表級鎖;
    • 鎖是一種資源,是要被爭搶的,被事務獲取;
    • 產生意向鎖時也會產生元數據鎖;
    • 原來懵的不止我一個(-_-);
    • 意向鎖解決的是行鎖和表鎖的衝突問題;

行級鎖

  • 介紹

    行級鎖,每次操作鎖住對應的行數據。鎖定粒度最小,發生衝突的概率最低,併發度最高。應用在InnoDB存儲引擎中。

    InnoDB的數據是基於索引組織的,行鎖是通過對索引上的索引項來實現的,而不是對記錄加的鎖。對於行級鎖,主要分為以下三類:

    1. 行鎖(Record Lock):鎖定單個記錄的鎖,防止其他事務對此進行update和delete。在RC、RR隔離級別下都支持。
    2. 間隙鎖(Gap Lock):鎖定索引記錄間隙(不含該記錄),確保索引記錄間隙不變,防止其他事務在這個間隙進行insert,產生幻讀。
    3. 臨鍵鎖(Next-Key Lock):行鎖和間隙鎖組合,同時鎖住數據,並鎖住數據前面的間隙Gap。在RR隔離級別下支持。

  • 行鎖

    InnoDB實現了以下兩種類型的行鎖:

    1. 共用鎖(S):允許一個事務去讀一行,阻止其他事務獲得相同數據集的排他鎖;
    2. 排他鎖(X):允許獲取排他鎖的事務更新數據,阻止其他事務獲得相同數據集的共用鎖和排他鎖;

    SQL 行鎖類型 說明
    INSERT ... 排他鎖 自動加鎖
    UPDATE ... 排他鎖 自動加鎖
    DELETE ... 排他鎖 自動加鎖
    SELECT(正常) 不加任何鎖
    SELECT ... LOCK IN SHARE MODE 共用鎖 需要手動在SELECT之後加LOCK IN SHARE MODE
    SELECT ... FOR UPDATE 排他鎖 需要手動在SELECT之後加 FOR UPDATE
    • 預設情況下,InnoDB在REPEATABLE READ事務隔離級別運行,InnoDB使用next-key鎖進行搜索和索引掃描,以防止幻讀。

      1. 針對唯一索引進行檢索時,對已存在的記錄進行等值匹配時,將會自動優化為行鎖。
      2. InnoDB的行鎖是針對於索引加的鎖,不通過索引條件檢索數據,那麼InnoDB將對錶中的所有記錄加鎖。
    • 可以通過以下SQL,查看意向鎖及行鎖的加鎖情況:

      select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;

    • 彈幕摘要:記住這裡,select一定要自己主動去加鎖,如果不主動加鎖是可以發生幻讀的;

  • 間隙鎖/臨鍵鎖

    預設情況下,InnoDB在REPEATABLE READ事務隔離級別運行,InnoDB使用next-key鎖進行搜索和索引掃描,以防止幻讀。

    1. 索引上的等值查詢(唯一索引),給不存在的記錄加鎖時,優化為間隙鎖。
    2. 索引上的等值查詢(普通索引),向右遍歷時最後一個值不滿足查詢需求時,next-key lock 退化為間隙鎖。
    3. 索引上的範圍查詢(唯一索引),會訪問到不滿足條件的第一個值為止。

    註意 :間隙鎖的唯一目的就是防止其他事務插入間隙。間隙鎖可以共存,一個事務採用的間隙鎖不會阻止另一個事務在同一個間隙上採用間隙鎖。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 以MySQL資料庫為例 # 一. 安裝 NuGet搜索Dapper.Lite並安裝最新版本。 ![](https://img2023.cnblogs.com/blog/174862/202306/174862-20230602155913303-757935399.jpg) NuGet搜索MySql ...
  • 從按鈕、文本框到下拉框、列表框,WPF提供了一系列常用控制項,每個控制項都有自己獨特的特性和用途。通過靈活的佈局容器,如網格、堆棧面板和換行面板,我們可以將這些控制項組合在一起,實現複雜的界面佈局。而通過樣式和模板,我們可以輕鬆地定製控制項的外觀和行為,以符合我們的設計需求。本篇記錄WPF入門需要瞭解的樣式... ...
  • 在一些複雜的業務表中間查詢數據,有時候操作會比較複雜一些,不過基於SqlSugar的相關操作,處理的代碼會比較簡單一些,以前我在隨筆《基於SqlSugar的開發框架循序漸進介紹(2)-- 基於中間表的查詢處理》介紹過基於主表和中間表的聯合查詢,而往往實際會比這個會複雜一些。本篇隨筆介紹聯合多個表進行... ...
  • 一、功能變數名稱解析過程 DNS功能變數名稱完整解析過程 1、查詢本地 hosts文件 解析記錄 2、查詢客戶端本地DNS緩存記錄 3、訪問DNS轉發(緩存)伺服器本地緩存記錄 4、轉發到權威伺服器查詢本地緩存記錄 5、訪問權威伺服器解析記錄 6、權威伺服器迭代查詢 6.1、訪問子域權威伺服器查詢本地緩存記錄 6. ...
  • # ulimit Linux ulimit命令用於控制shell程式的資源。 ```shell [email protected] 10:41:17 [pwd:~]# ulimit --help ulimit: ulimit [-SHabcdefiklmnpqrstuvxPT ...
  • ## 01|修改Win用戶名 打開運行,輸入cmd,回車; 輸入control userpasswords2,回車; 點擊屬性,修改用戶名,點擊確定; 打開運行,輸入regedit,回車; 定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\Cur ...
  • [TOC](快速上手kettle(三)壺中可以放些啥?) ### 序言 快速上手kettle開篇中,我們將kettle比作壺,並對這個壺做了簡單介紹。 而上一期中我們實現了①將csv文件通過kettle轉換成excel文件; ②將excel文件通過kettle寫入到MySQL資料庫表中 這兩個案例。 ...
  • # mysql編碼錯誤 ![image-20230604115322661](https://img2023.cnblogs.com/blog/2862884/202306/2862884-20230604115422584-1121547495.png) 問題出現在用django的admin組件向 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...