面試必問的MySQL鎖與事務隔離級別

来源:https://www.cnblogs.com/xiaoqiang-code/archive/2019/09/11/11509294.html
-Advertisement-
Play Games

之前多篇文章從mysql的底層結構分析、sql語句的分析器以及sql從優化底層分析, 還有工作中常用的sql優化小知識點。面試各大互聯網公司必問的mysql鎖和事務隔離級別,這篇文章給你打神助攻,一飛衝天。 鎖定義 鎖是電腦協調多個進程或線程併發訪問某一資源的機制。 在資料庫中,除了傳統的計算資源 ...


之前多篇文章從mysql的底層結構分析、sql語句的分析器以及sql從優化底層分析, 還有工作中常用的sql優化小知識點。面試各大互聯網公司必問的mysql鎖和事務隔離級別,這篇文章給你打神助攻,一飛衝天。

鎖定義

鎖是電腦協調多個進程或線程併發訪問某一資源的機制。
在資料庫中,除了傳統的計算資源(如 CPU、RAM、I/O等)的爭用以外,數據也是一種需要用戶共用的資源。如何保證數據併發訪問的一致性、有效性是所有資料庫需要解決的問題,鎖衝突也是影響資料庫併發性能的一個重要因素。

鎖分類

  • 從性能上分為樂觀鎖和悲觀鎖
  • 從資料庫操作的類型分為讀鎖和寫鎖

讀鎖:針對同一份數據,多個讀操作可以同時進行而不會互相影響
寫鎖:當前寫操作沒有完成前,它會阻斷其他寫鎖和讀鎖

  • 從對數據的操作粒度分為表鎖和行鎖

    表鎖

    每次操作會鎖住整張表。
    優點:開銷小,加鎖快,不會出現死鎖
    缺點:鎖的粒度大,發生鎖衝突的概率高,併發度最低
--手動增加表鎖
lock table 表名稱 read(write),表名稱2 read(write);
--查看表上加過的鎖
show open tables;
--刪除表鎖
unlock tables;
  • 加讀鎖
lock table 表名 read;

當前session和其他session都可以讀該表;
當前session中插入或者更新鎖定的表都會報錯,其他session插入或更新則會等待。

  • 加寫鎖
lock table 表名 write;

當前session對該表的增刪改查都沒有問題,其他session對該表的所有操作被阻塞。

  • MyISAM表分析

MyISAM在執行查詢語句select前,會自動給涉及的所有表加讀鎖,在執行增刪該操作前,會自動給涉及的表加寫鎖。
對MyISAM表的讀操作(加讀鎖),不會阻礙其他進程對同一表的讀請求,但會阻礙對同一表的寫請求。只有當讀鎖釋放後,才會執行其他操作的寫操作。
對MyISAM表的寫操作(加寫鎖),會阻塞其他進程對同一表的讀和寫操作,只有當寫鎖釋放後,才會執行其他進程的讀寫操作。

行鎖

每次總鎖住一行數據。
優點:鎖粒度最小,發生鎖衝突概率最低,併發度最高
缺點:開銷大、加鎖慢,會出現死鎖;

行鎖支持事務

事務是由一組SQL語句組成的邏輯處理單元,事務具有以下4個屬性,通常簡稱為事務的ACID屬性。

  • 原子性(Atomicity):事務是一個原子操作單元,對數據的修改,要麼全部執行,要麼全部不執行。
  • 一致性(Consistent):在事務開始和完成時,數據都必須保持一致的狀態。意味著所有相關的數據規則都必須應用於事務的修改,以保持數據的完整性;事務結束時,所有的內部數據結構也都必須是正確的。
  • 隔離性(Isolation):資料庫系統提供一定的隔離機制,保證事務在不受外部併發操作影響的“獨立”環境執行。這意味著事務處理過程中的中間狀態對外部是不可見的,反之亦然。
  • 持久性(Durable):事務完成之後,它對於數據的修改是永久性的,即使出現系統故障也能保持。

併發事務處理帶來的問題

  • 更新丟失(Lost Update)
    當兩個或多個事務選擇同一行,然後基於最初選定的值更新改行時,有於每個事務都不知道其他事務的存在,就會發生更i性能問題:最後的更新覆蓋了由其他事務所做的更新。
  • 臟讀(Dirty Reads)
    一個事務正在對一條記錄做修改,在這個事務完成並提交前,這條記錄的數據就處於不一致的狀態;這時,另一個事務也來讀取同一條記錄,如果不加控制,第二個事務讀取了這些“臟”數據,並據此進一步的處理,就會產生未提交的數據依賴關係。這種現象被稱為“臟讀”。
    事務A讀取到事務B已經修改但未提交的數據,還在這個數據基礎上做了修改。此時,如果事務B回滾了,事務A的數據無效,不符合一致性要求。
  • 不可重讀(Non-Repetable Reads)
    一個事務在讀取某些數據後的某個時間,再次讀取以前讀過的數據,卻發現起讀出的數據已經發生了改變、或某些記錄已經被刪除。這種現象叫做“不可重讀”。
    事務A讀取到了事務B已經提交的修改數據,不符合隔離性。
  • 幻讀(Phantom Reads)
    一個事務按照相同的查詢條件讀取以前檢索過的數據,卻發現某些事務插入了滿足其查詢條件的新數據,這種現象稱為“幻讀”。
    事務A讀取了事務B提交的新增數據,不符合隔離性。

事務隔離級別

臟讀、不可重讀和幻讀,其實都是資料庫讀一致性的問題,必須由資料庫提供一定的事務隔離機制來解決。

資料庫的事務隔離級別越嚴格,併發副作用越小,但付出的代價也越大,因為事務隔離實質上就是事務在一定程度上“串列化”進行,這顯然與“併發”是矛盾的。
同時,不同的應用對讀一致性和事務隔離程度的要求也是不同的,許多應用對“不可重讀”和“幻讀”並不敏感,可能更關心數據的併發訪問的能力。

還沒關註我的公眾號?

  • 掃文末二維碼關註公眾號【小強的進階之路】可領取如下:
  • 學習資料: 1T視頻教程:涵蓋Javaweb前後端教學視頻、機器學習/人工智慧教學視頻、Linux系統教程視頻、雅思考試視頻教程;
  • 100多本書:包含C/C++、Java、Python三門編程語言的經典必看圖書、LeetCode題解大全;
  • 軟體工具:幾乎包括你在編程道路上的可能會用到的大部分軟體;
  • 項目源碼:20個JavaWeb項目源碼。
    小強的進階之路二維碼

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

-Advertisement-
Play Games
更多相關文章
  • 作為開發人員,大家都知道,SpringBoot是基於Spring4.0設計的,不僅繼承了Spring框架原有的優秀特性,而且還通過簡化配置來進一步簡化了Spring應用的整個搭建和開發過程。另外SpringBoot通過集成大量的框架使得依賴包的版本衝突,以及引用的不穩定性等問題得到了很好的解決。 S ...
  • 如何逃離令人抓狂的 if-else 參數校驗的代碼,Van 帶你用validator快速搞定,節省更多的時間勾搭小姐姐。 ...
  • 原文再續,書接上一回 上回講到了,python IDLE的草稿本和作業本,並順便試了試python的輸入輸出,變數,運算的體驗,大家應該能感受到python的簡單了吧。 下麵我們繼續體驗python的強大,python之所以強大,是因為python有庫。(就如同人一樣學會了穿褲子也變得強大了) 課程 ...
  • 房天下 登錄 本次爬取的網址為: 一、分析請求 輸入用戶名和密碼,點擊登錄按鈕 請求的參數為: 就是輸入的用戶名, 是將密碼加密後的數據。我們只要找出密碼的加密方式就可以模擬登錄了。 二、密碼加密方式破解 這次我們以 作為關鍵字,進行搜索 找到加密位置之後,我們打上斷點,重新點擊登錄 找到密碼加密的 ...
  • 內容來自轉載整理 1.NumPy數值計算 NumPy是使用Python進行科學計算的基礎包,Numpy可以提供數組支持以及相應的高效處理函數,是Python數據分析的基礎,也是SciPy、Pandas等數據處理和科學計算庫最基本的函數功能庫,且其數據類型對Python數據分析十分有用。它包含: 一個 ...
  • 面試題 如何設計一個高併發系統? 面試官心理分析 說實話,如果面試官問你這個題目,那麼你必須要使出全身吃奶勁了。為啥?因為你沒看到現在很多公司招聘的 JD 里都是說啥,有高併發就經驗者優先。 如果你確實有真才實學,在互聯網公司里乾過高併發系統,那你確實拿 offer 基本如探囊取物,沒啥問題。面試官 ...
  • 前言 先列出java併發涉及的知識點,後面再慢慢補. java併發 1 常見概念 進程:程式執行的實體,操作系統資源調度資源分配的基本單元 線程:程式執行的最小單元,擁有獨立的堆棧和局部變數等屬性,可以共用進程的資源 同步是串列執行,阻塞 非同步是並行執行,非阻塞 併發:多個任務交替執行 並行:多個任 ...
  • 學習Python的第一天,也是我第一次寫博客的一天,不怎麼會寫博客,也不怎麼會Python,也不怎麼會寫總結.在學Python的第一天發現自己腦子不是很好用,在學習過程中出現很多錯誤,錯誤錦集如下,哈哈哈哈,要加油.以後要註意不要再犯下麵的錯誤了,不然以後在工作中很難獨立完成,也容易出現很多錯誤,這 ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...