MySQL中的鎖

来源:https://www.cnblogs.com/time-read/archive/2019/07/22/11227107.html
-Advertisement-
Play Games

資料庫中有很多鎖,但鎖是為瞭解決什麼問題?具體都有哪些鎖呢?這篇文章簡單對MySQL中的鎖做了一個總結 一、鎖的設計是為瞭解決什麼問題? 當多用戶讀寫數據的時候,就有可能會出現同一時刻對同一條數據的讀寫,如果是大家都只是對同一條數據進行讀,無所謂,大家讀到數據都是一樣的,但當有的想要讀取數據,有的想 ...


我學習MySQL是半路出家,剛開始接觸的時候,只知道資料庫的增刪改查和事務,直到有一天資料庫突然爆出(1205, 'Lock wait timeout exceeded; try restarting transaction'),那時候,我才知道資料庫還有鎖這麼一個玩意。這篇文章簡單談談我對MySQL鎖的理解與總結

一、鎖的設計是為瞭解決什麼問題?

我們知道資料庫能夠支持多用戶共同讀寫,當多用戶讀寫數據的時候,就有可能會出現同一時刻對多個用戶對同一條數據的讀寫,就會出現下麵的場景:

  1. 大家都只是對這一條數據進行讀取
  2. 有一部分人想要對這一條數據進行讀取,有一部分人想要對這一條數據進行修改
  3. 大家都想要對這一條數據進行修改

對於場景1,數據不會變化,大家讀到數據都是一樣的,

對於場景2,若讀數據的人不關心修改後的數據,只關心當前的值,對於讀數據的人是沒有影響的,對於修改數據的人,問題就出現了,大家都拿去修改了,然後保存了自己修改的值,這樣的話,我們要以誰修改的值為準呢,或者後面保存修改值的人會把前面保存的結果給覆蓋掉。

對於場景3,寫數據會出現和場景2一樣的情況。

如何優雅的解決上面的問題呢?資料庫引入了鎖的概念,數據可以加鎖,用來控制對數據的合理訪問。對於上面的場景3,當用戶1想要修改這一條數據時,必須先獲取這一條數據的鎖,然後在修改,同時用戶2想要修改這一條數據時,也要先獲取這一條數據的鎖,但鎖被用戶1獲取了,他只能等用戶1修改完,釋放鎖後,才能繼續修改這一條數據,這樣每個人都能修改數據,就不會亂了。

根據鎖的類型可以分為讀鎖,寫鎖

根據鎖的範圍可以分為全局鎖,表級鎖,行鎖

二、讀鎖,寫鎖

當我們需要對一個數據進行讀取的時候,就需要獲取讀鎖,當我們對一個數據進行修改的時候,就需要獲取寫鎖

讀鎖之間不互斥,當對一個數據加了讀鎖後,還可以對它繼續加讀鎖,不能添加寫鎖

寫鎖與讀鎖之間,寫鎖與寫鎖之間互斥,當對一個數據加了寫鎖後,不能繼續添加其他鎖了,必須要等待寫鎖釋放

三、全局鎖

全局鎖,會鎖住整個資料庫,整個資料庫不可寫入數據,不可修改數據表結構,只能讀取數據,這樣的話,就保證了整個資料庫只讀,最典型的應用就是全局備份數據,備份數據期間,我們不希望有數據能寫入資料庫中,不然後有可能備份後的數據是不完整的數據。

比如有兩個表中的數據是關聯的,第一張表a,第二張表b,表a增加一條記錄時,表b就會記錄一條關於表a操作的記錄

現在在我們備份的時候,不加全局鎖,考慮下麵的情況

時刻1. 備份表a

時刻2. 表a插入了一條記錄,表b也要記錄一條

時刻3. 備份表b

這樣的順序下來,備份後的數據表b中多記錄了一次操作

我們可以通過加全局鎖,來實現在備份過程中,只能讀取數據,無法修改數據,來保證備份後數據的一致性

四、表級鎖

表級鎖可分為兩種,一種是表鎖,一種元數據鎖(MDL)

MDL鎖不需要顯示使用,在訪問表的時候會自動加上

當要讀取一個表時,要獲取MDL讀鎖,當要修改一個表的結構的時候,就要獲取MDL寫鎖。MDL主要是為了防止DDL和DML併發的衝突。

表鎖鎖一整表,鎖的範圍還是太大了。

五、行鎖

行鎖時目前最細粒度的鎖了,只有Innodb引擎支持,MYISAM引擎只支持到表級鎖

innodb事務開啟後,行鎖是需要的時候才會加上,但不是不需要了就會立即釋放行鎖,而是等整個事務提交之後,才會釋放行鎖。這個就是mysql的兩階段鎖協議。

有這麼一種場景,一個事務執行中,要執行很多條語句,其中有一條語句會更新同一行數據。當多個事務併發的時候,必定會爭奪同一行數據的鎖,當一個事務持有鎖的時候,其他事務就必須等待。在這種場景下,我們該如何設計語句的執行順序,讓等待的時間最少?

我們已經知道了兩階段鎖協議,鎖在事務結束的時候才會釋放,所以,把更新同一行數據的語句越往後放,等待的時間就會越少。

innodb已經有了行鎖,但還是不能夠保證併發事務的正確性,為此,innodb引入了新的鎖,叫間隙鎖,當要更新數據時,在一行行掃描加鎖的過程中,不僅會加行鎖,還會添加間隙鎖,也就數據行之間的鎖。

六、總結

MySQL中的鎖機制就是為瞭解決共用資源的問題,為了從不同程度控制資源的讀寫,相應的引入了全局鎖,表級鎖,行鎖,以及不同鎖類型。


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

-Advertisement-
Play Games
更多相關文章
  • 本文首發於:微信公眾號「運維之美」,公眾號 ID:Hi Linux。 ​「運維之美」是一個有情懷、有態度,專註於 Linux 運維相關技術文章分享的公眾號。公眾號致力於為廣大運維工作者分享各類技術文章和發佈最前沿的科技信息。公眾號的核心理念是:分享,我們認為只有分享才能使我們的團體更強大。如果你想第 ...
  • 我們在Linux系統中如何找到文件系統的掛載時間呢,下麵實驗測試環境為RHEL 6.6,其它Linux版本沒有驗證測試。這個簡單測試了一下常用的ext3/4、xfs、nfs文件系統。 ext文件系統 如果文件系統類型為ext3、ext4(ext2沒有測試,這麼老的文件系統也沒有多少意義了),那麼可以... ...
  • 查看 sql查詢記錄 日誌是否開啟 二進位日誌 是否開啟 開啟與關閉二進位日誌 mysql-bin.000001刪除二進位日誌文件方法,執行以下語句(不要直接刪除文件) 我用的是寶塔.不知為何用以上方法無效.在管理面板裡面設置才行.用其他軟體搭建的環境應該用以上方法可以吧,有待嘗試 ...
  • 分組查詢 分組函數 :group by 要分組的列名 對數據集合處理的函數,可以處理多行數據--5個分組函數--count --計數函數,用於數量的統計--sum 求和函數,對數據進行求和--avg 求評平均,對一組數據求平均值--min ,求最小值--max ,求最大值--分組函數,也叫統計函數, ...
  • 1. 資料庫操作與存儲引擎 1.1 資料庫和資料庫對象 資料庫對象:存儲,管理和使用數據的不同結構形式,如:表、視圖、存儲過程、函數、觸發器、事件等。 資料庫:存儲資料庫對象的容器。 資料庫分兩種: ①系統資料庫(系統自帶的資料庫):不能修改,不能刪除 information_schema:存儲數據 ...
  • 使用批處理命令註冊運行mysql資料庫,無需註冊mysql服務,可以在任意電腦登錄使用,一次配置,到處運行,就是這麼方便 ...
  • orcal 第二章 練習1 1.使用兩種方式查詢所有員工信息 select * from emp select EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO from emp 2.查詢員工編號、員工姓名、員工職位、員工月 薪、工作部門編號。 select ...
  • 看到網上很多朋友在問,limit分頁之後按照欄位屬性排序的問題,在這裡分享一下我的用法: 1.網上答案: 每頁顯示5個,顯示第三頁信息,按照年齡從小到大排序 select * from student order by age asc limit 10,5; 這個答案是先實現了排序,再分頁的操作,而 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...