資料庫常見面試題:樂觀、悲觀鎖,行鎖、表鎖、讀、寫鎖,間隙鎖

2020-12-17 進擊的小科
資料庫面試題

MySQL資料庫常見面試題:闡述樂觀、悲觀鎖,、表鎖,讀、寫鎖,間隙鎖

(重要,好多公司都考)

解析參考

根據加鎖範圍

全局鎖:是對整個資料庫實例加鎖。常的場景是全庫邏輯備份(也就是把整庫每個表都select出來存成本),對於InnoDB可以可重複讀這隔離級別進備份,但是對於MyISAM只能全局鎖表級鎖。

表鎖: lock tables t1 read, t2 write; 那麼該線程只能讀t1,寫t2,其他線程只能寫t1,讀t2。

元數據鎖:即MDL,MySQL5.5版本引。當對個表做增刪改查操作的時候,加MDL讀鎖;當要對表變更操作的時候,加MDL寫鎖。讀鎖之間不互斥,讀寫鎖之間、寫鎖之間是互斥的。

MySQL所有引擎都持表鎖。

級鎖

由各個引擎實現。

即鎖定某個表中的特定,並發度,鎖粒度低。

在InnoDB事務中,鎖是在需要的時候才加上的,但並不是不需要了就刻釋放,是要等到事務結束時才釋放,這個就是兩階段鎖協議 。

鎖容易產死鎖,此時需要使InnoDB的主動死鎖檢測 。

在InnoDB中,級鎖都是基於索引的,如果條SQL語句不到索引是不會使級鎖的,會

使表級鎖把整張表鎖住。

間隙鎖(GAP)

是個範圍於表鎖,於鎖的鎖,主要是為了防幻讀。

如果查詢條件沒有建索引或者不是唯索。引,則會加上間隙鎖(普通查詢是快照讀,這不考慮)

加鎖範圍是查詢條件的兩側。

根據鎖的讀寫式

共享鎖稱為讀鎖,簡稱S鎖。共享鎖就是多個事務對於同數據可以共享把鎖,都能訪問到數據,但是只能讀不能修改。

排他鎖稱為寫鎖,簡稱X鎖。排他鎖就是不能與其他鎖並存,如個事務獲取了個數據的排他鎖,其他事務就不能再獲取該的其他鎖,包括共享鎖和排他鎖,但是獲取排他鎖的事務是可以對數據就讀取和修改

SS鎖不互斥,SX和XX鎖都互斥

根據鎖的特徵

悲觀鎖:總是假設最壞的情況,每次去拿數據的時候都認為別會修改,所以每次在拿數據的時

候都會上鎖,這樣別想拿這個數據就會阻塞直到它拿到鎖。傳統的關係型資料庫邊就到了很多這種鎖機制,如鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。Java中synchronized和ReentrantLock等獨佔鎖就是悲觀鎖思想的實現。

樂觀鎖:總是假設最好的情況,每次去拿數據的時候都認為別不會修改,所以不會上鎖,但是在更新的時候會判斷下在此期間別有沒有去更新這個數據,可以使版本號機制和CAS算法實現。樂觀鎖適於多讀的應類型,這樣可以提吞吐量。使版本號時,可以在數據初始化時指定個版本號,每次對數據的更新操作都對版本號執+1操作。並判斷當前版本號是不是該數據的最新的版本號,如果不是,則重新更新。在JDK中的些包,如java.util.concurrent.atomic 包下的原變量類就是使了樂觀鎖的種實現式CAS實現的。

樂觀鎖在不發取鎖失敗的情況下開銷悲觀鎖,但是旦發失敗回滾開銷則較,因此適合在取鎖失敗概率較的場景,可以提升系統並發性能

樂觀鎖還適於些較特殊的場景,例如在業務操作過程中法和資料庫保持連接等悲觀鎖法適的地。

以上就是小科今天整理提供的MySQL面試題,你記住並理解了嗎?希望以上的內容能夠為學習C++、MySQL的同學提供了有用的面試素材及學習素材,以後小科每日均會提供MySQL、Python及Web相關的習題,趕快學習起來吧。

相關焦點

  • 共享鎖、排他鎖、互斥鎖、悲觀鎖、樂觀鎖、行鎖、表鎖、頁面鎖、不可重複讀、丟失修改、讀髒數據
    悲觀鎖、樂觀鎖:悲觀鎖: 總是假設最壞的情況,每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻塞直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。再比如Java裡面的同步原語synchronized關鍵字的實現也是悲觀鎖。悲觀鎖和樂觀鎖推薦:面試難點:你了解樂觀鎖和悲觀鎖嗎?
  • MySQL中悲觀鎖和樂觀鎖到底是什麼?
    索引和鎖是資料庫中的兩個核心知識點,隔離級別的實現都是通過鎖來完成的 按照鎖顆粒對鎖進行劃分 ? 鎖用來對數據進行鎖定,我們可以從鎖定對象的粒度大小來對鎖進行劃分,分別為行鎖、頁鎖和表鎖。
  • 解決MySQL可重複讀——詳解間隙鎖
    間隙鎖(Gap Lock)是Innodb在可重複讀提交下為了解決幻讀問題時引入的鎖機制,(下面的所有案例沒有特意強調都使用可重複讀隔離級別)幻讀的問題存在是因為新增或者更新操作,這時如果進行範圍查詢的時候(加鎖查詢),會出現不一致的問題,這時使用不同的行鎖已經沒有辦法滿足要求,需要對一定範圍內的數據進行加鎖,間隙鎖就是解決這類問題的。
  • 小夥一步步試探MySQL鎖機制,居然是這樣?
    鎖的粒度InnoDB裡既有行級別的鎖,又有表級別的鎖;表鎖,顧名思義,是鎖住一張表;行鎖就是鎖住表裡面的一行數據。看一下這兩種鎖的一些差異鎖定粒度,表鎖肯定是大於行鎖的。加鎖效率,表鎖是大於行鎖的。為什麼?表鎖只需要直接鎖住這張表就行了,而行鎖,還需要在表面去檢索這一行數據,所以表鎖的加鎖效率更高。衝突概率,表鎖大於行鎖,因為當我們鎖住一張表的時候,其他任何一個事務都不能操作這張表。
  • 資料庫:MySQL 中 「select ... for update」 排他鎖分析
    在進行事務操作時,通過「for update」語句,MySQL會對查詢結果集中每行數據都添加排他鎖,其他線程對該記錄的更新與刪除操作都會阻塞。排他鎖包含行鎖、表鎖。有兩種解決方案:悲觀鎖方案:每次獲取商品時,對該商品加排他鎖。也就是在用戶A獲取獲取 id=1 的商品信息時對該行記錄加鎖,期間其他用戶阻塞等待訪問該記錄。悲觀鎖適合寫入頻繁的場景。
  • PostgreSQL中的表鎖
    最開始只有兩種鎖:Share與Exclusive,共享鎖與排它鎖,即所謂讀鎖與寫鎖。讀鎖的目的是阻止表數據的變更,而寫鎖的目的是阻止一切並發訪問。這很好理解。後來隨著多版本並發控制技術的出現(PostgreSQL使用快照隔離實現MVCC),讀不阻塞寫,寫不阻塞讀(針對表的增刪改查而言)。
  • 面試官:你說說互斥鎖、自旋鎖、讀寫鎖、悲觀鎖、樂觀鎖的應用場景
    那接下來,針對不同的應用場景,談一談「互斥鎖、自旋鎖、讀寫鎖、樂觀鎖、悲觀鎖」的選擇和使用。前言互斥鎖與自旋鎖:誰更輕鬆自如?公平讀寫鎖比較簡單的一種方式是:用隊列把獲取鎖的線程排隊,不管是寫線程還是讀線程都按照先進先出的原則加鎖即可,這樣讀線程仍然可以並發,也不會出現「飢餓」的現象。互斥鎖和自旋鎖都是最基本的鎖,讀寫鎖可以根據場景來選擇這兩種鎖其中的一個進行實現。樂觀鎖與悲觀鎖:做事的心態有何不同?
  • InnoDB加鎖實驗
    鎖資料庫通過鎖來保證讀寫操作的一致性.InnoDB中使用的最多的行級鎖(record lock), 所有的行級鎖都是作用在索引上面的. InnoDB通過用行鎖代替表鎖大大提高了對並發的支持. 從模式層面分, 鎖主要包括讀鎖(shared lock, 後面簡稱S鎖)和寫鎖(exclusive lock, 後面簡稱X鎖), 這個讀寫的概念, 在行級鎖和表級鎖中都有體現. 與行級鎖對應的還有表級鎖(table lock, 簡單來說就是鎖定整張表, 比如要刪除所有數據), 意向鎖(intension lock, 按讀寫分, 後面簡稱IS, IX).
  • 樂觀鎖和悲觀鎖的區別(最全面的分析)
    傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。它指的是對數據被外界(包括本系統當前的其他事務,以及來自外部系統的事務處理)修改持保守態度,因此,在整個數據處理過程中,將數據處於鎖定狀態。
  • 陌陌面試官:談談你對MySQL中事務和鎖的理解?
    讀-寫 即一個事務進行讀取操作,另一個進行寫入操作。這種情況下可能會產生髒讀、不可重複讀、幻讀。最好的方案是讀操作利用多版本並發控制(MVCC),寫操作進行加鎖。鎖的粒度按鎖作用的數據範圍進行分類的話,鎖可以分為行級鎖和表級鎖。
  • 樂觀鎖&悲觀鎖&自旋鎖
    傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。二、樂觀鎖總是假設最好的情況,每次去拿數據的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本號機制和CAS算法實現。
  • 史上最全的select加鎖分析(Mysql)
    注意了,innodb一定存在聚簇索引,因此行鎖最終都會落到聚簇索引上!Gap Locks:簡單翻譯為間隙鎖,是對索引的間隙加鎖,其目的只有一個,防止其他事物插入數據。在Read Committed隔離級別下,不會使用間隙鎖。這裡我對官網補充一下,隔離級別比Read Committed低的情況下,也不會使用間隙鎖,如隔離級別為Read Uncommited時,也不存在間隙鎖。
  • Java 中15種鎖的介紹:公平鎖,可重入鎖,獨享鎖,互斥鎖,樂觀鎖,分段鎖,自旋鎖等等
    讀寫鎖有三種狀態:讀加鎖狀態、寫加鎖狀態和不加鎖狀態讀寫鎖在Java中的具體實現就是ReadWriteLock一次只有一個線程可以佔有寫模式的讀寫鎖,但是多個線程可以同時佔有讀模式的讀寫鎖。當其處於寫狀態鎖下,任何想要嘗試獲得鎖的線程都會被阻塞,直到寫狀態鎖被釋放;如果是處於讀狀態鎖下,允許其它線程獲得它的讀狀態鎖,但是不允許獲得它的寫狀態鎖,直到所有線程的讀狀態鎖被釋放;為了避免想要嘗試寫操作的線程一直得不到寫狀態鎖,當讀寫鎖感知到有線程想要獲得寫狀態鎖時,便會阻塞其後所有想要獲得讀狀態鎖的線程。所以讀寫鎖非常適合資源的讀操作遠多於寫操作的情況。
  • 史上最全的select加鎖分析(MySQL)
    鎖是在加索引上而不是行上的。注意了,innodb一定存在聚簇索引,因此行鎖最終都會落到聚簇索引上!Gap Locks:簡單翻譯為間隙鎖,是對索引的間隙加鎖,其目的只有一個,防止其他事物插入數據。在Read Committed隔離級別下,不會使用間隙鎖。
  • 通過加鎖控制Oracle資料庫並發事務
    在Oracle資料庫中要處理並發的話,可以通過加鎖,和設置只讀事務,以及設置隔離級別來控制處理並發。今天主要介紹的是通過加鎖來控制並發事務。在並發控制中,Oracle 主要利用了事務的特性和鎖的機制。鎖可以防止用戶訪問同一數據是相互幹擾,而事務之間存在著不同級別的隔離作用。通過加鎖避免 寫數據丟失在Oracle中,解決兩個寫事務衝突的方法就是採用「加鎖」。如當A事務要修改- - 數據時,就對該數據加鎖,禁止其他事務對該數據的修改。只有當A事務完成寫操作並將鎖打開後,才運行其他事務的寫操作。
  • MySQL InnoDB 引擎中的 7 種鎖類型,你都知道嗎?
    共享/排它鎖(Shared and Exclusive Locks)使用的語義為:共享鎖之間不互斥,簡記為:讀讀可以並行排他鎖與任何鎖互斥,簡記為:寫讀,寫寫不可以並行可以看到,一旦寫數據的任務沒有完成,數據是不能被其他任務讀取的,這對並發度有較大的影響。
  • MySQL 面試,必須掌握的 8 個知識點
    對於程式設計師來說,面試內容一般分為兩個部分:編程面試題部分 + 資料庫面試題部分。據不完全調查,作為資料庫中的主流選擇 MySQL 的薪資待遇正在逐年增加,而且似乎不僅僅是程式設計師在學,就連很多產品經理和運營人也開始學習 MySQL 去分析數據。
  • 擦亮自己的眼睛去看SQL Server之談談鎖機制
    這時候就需要去權衡,SQLServer鎖管理器就充當權衡這兩者關係的角色,如下圖所示:SQL Server中鎖的知識點實在太多,比如鎖從模式上分為:共享鎖(S)、更新鎖(U)、排他鎖(X)、架構鎖(Sch-S、Sch-M)、意向鎖(IS、IU、IX)、轉換鎖(SIX、SIU、UIX)、大容量更新鎖(BU);鎖從粒度上分為:資料庫鎖、文件鎖、表鎖、堆鎖、索引鎖、頁鎖、鍵鎖、
  • 最受歡迎的前端框架Bootstrap,Ajax異步刷新技術,Mysql資料庫鎖——
    1.排他鎖排他鎖又稱為寫鎖,一個事務在一行數據加上排他鎖後,其他事務不能再在其上加其他的鎖,也修改不了該數據,但是可以直接通過select …from…查詢數據,因為普通查詢沒有任何鎖機制。在InnoDB引擎中,開啟事務後,update,delete,insert都會自動給涉及到的數據加上排他鎖,select語句默認不會加任何鎖類型.
  • Lock鎖 精講
    使用synchronized方法或語句可訪問與每個對象關聯的隱式監視器鎖,但會強制所有鎖的獲取和釋放以塊結構方式進行。當獲取多個鎖時,它們必須以相反的順序釋放鎖。雖然用於synchronized方法和語句的作用域機制使使用監視器鎖的編程變得更加容易,並且有助於避免許多常見的涉及鎖的編程錯誤,但在某些情況下,您需要以更靈活的方式使用鎖。