之前多篇文章從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專案原始碼。