主頁 > 資料庫 > 鎖

2023-06-05 08:37:35 資料庫

概述

  • 介紹

    鎖是計算機協調多個行程或執行緒并發訪問某一資源的機制,在資料庫中,除傳統的計算資源(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. 索引上的范圍查詢(唯一索引),會訪問到不滿足條件的第一個值為止,

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

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/554299.html

標籤:其他

上一篇:Django遷移資料庫編碼錯誤

下一篇:返回列表

標籤雲
其他(160348) Python(38201) JavaScript(25475) Java(18185) C(15236) 區塊鏈(8269) C#(7972) AI(7469) 爪哇(7425) MySQL(7233) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5346) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4582) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2434) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1981) 功能(1967) HtmlCss(1952) Web開發(1951) C++(1928) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1879) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • # **鎖** ## **概述** - **介紹** 鎖是計算機協調多個行程或執行緒并發訪問某一資源的機制。在資料庫中,除傳統的計算資源(CPU、RAM、I/O)的爭用以外,資料也是一種供許多用戶共享的資源。如何保證資料并發訪問的一致性、有效性是所有資料庫必須解決的一個問題,鎖沖突也是影響資料庫并發訪 ......

    uj5u.com 2023-06-05 08:37:35 more
  • Django遷移資料庫編碼錯誤

    # mysql編碼錯誤 ![image-20230604115322661](https://img2023.cnblogs.com/blog/2862884/202306/2862884-20230604115422584-1121547495.png) 問題出現在用django的admin組件向 ......

    uj5u.com 2023-06-05 08:26:05 more
  • # **鎖** ## **概述** - **介紹** 鎖是計算機協調多個行程或執行緒并發訪問某一資源的機制。在資料庫中,除傳統的計算資源(CPU、RAM、I/O)的爭用以外,資料也是一種供許多用戶共享的資源。如何保證資料并發訪問的一致性、有效性是所有資料庫必須解決的一個問題,鎖沖突也是影響資料庫并發訪 ......

    uj5u.com 2023-06-05 08:25:47 more
  • 快速上手kettle(三)壺中可以放些啥?

    [TOC](快速上手kettle(三)壺中可以放些啥?) ### 序言 快速上手kettle開篇中,我們將kettle比作壺,并對這個壺做了簡單介紹。 而上一期中我們實作了①將csv檔案通過kettle轉換成excel檔案; ②將excel檔案通過kettle寫入到MySQL資料庫表中 這兩個案例。 ......

    uj5u.com 2023-06-05 08:24:27 more
  • 觸發器

    # 觸發器 ## **一、介紹** 觸發器是與表有關的資料庫物件,指在insert/update/delete之前或之后,觸發并執行觸發器中定義SQL陳述句集合。觸發器的這種特性可以協助應用在資料庫端確保資料的完整性,日志記錄,資料校驗等操作。 使用別 名OLD 和 NEW 來參考觸發器中發生變化的記 ......

    uj5u.com 2023-06-04 08:10:42 more
  • 04_深入淺出索引(上)

    # 04_深入淺出索引(上) ? ### 索引的概念 索引的概念:索引是一種資料結構,用于提高資料庫查詢效率。就像一本書的目錄一樣,索引可以幫助資料庫在大量資料中快速找到需要的資料,減少查詢時間和資源消耗。 除了提高查詢效率,索引還可以幫助資料庫實作唯一性約束、主鍵約束和外鍵約束等資料完整性約束。 ......

    uj5u.com 2023-06-04 08:10:37 more
  • 4種資料同步到Elasticsearch方案

    上周聽到公司同事分享 MySQL 同步資料到 ES 的方案,發現很有意思,感覺有必要將這塊知識點再總結提煉一下,就有了這篇文章。 本文會先講述資料同步的 4 種方案,并給出常用資料遷移工具,干貨滿滿! 不 BB,上文章目錄: 1. 前言 在實際專案開發中,我們經常將 MySQL 作為業務資料庫,ES ......

    uj5u.com 2023-06-04 08:10:16 more
  • 大白話講解資料庫的三級模式及二級映像(所謂的內外模式在生活中到

    具象化理解資料庫的三級模式及二級映像 形象一點來說,把資料看做貨物,資料庫是倉庫,模式就是表格。 你有一個倉庫,倉庫里成千上萬的貨物,隨便你怎么堆,你堆個正方體,堆個圓柱體,甚至隨便亂堆都行,你怎么堆的叫內模式。 完事你寫了一張表,表上對全部貨物按某個標準分類,而且標清了啥貨物在哪(這個操作就是從內 ......

    uj5u.com 2023-06-04 08:10:01 more
  • 一篇搞定MySQL索引長度(key_len)計算規則

    MySQL索引長度(key_len)計算 計算規則 索引欄位:沒有設定 NOT NULL,則需要加 1 個位元組。 定長欄位:tinyint 占 1 個位元組、int 占 4個位元組、bitint 占 8 個位元組、date 占 3個位元組、datetime 占 5 個位元組、char(n) 占 n 個位元組。 ......

    uj5u.com 2023-06-04 08:09:57 more
  • 觸發器

    # 觸發器 ## **一、介紹** 觸發器是與表有關的資料庫物件,指在insert/update/delete之前或之后,觸發并執行觸發器中定義SQL陳述句集合。觸發器的這種特性可以協助應用在資料庫端確保資料的完整性,日志記錄,資料校驗等操作。 使用別 名OLD 和 NEW 來參考觸發器中發生變化的記 ......

    uj5u.com 2023-06-04 08:09:02 more