mysql行級鎖 頁級鎖和表級鎖

2021-09-25 18:41:00 字數 2788 閱讀 8363

mysql的鎖是由具體的儲存引擎實現的。所以像mysql的預設引擎myisam和第三方外掛程式引擎 innodb的鎖實現機制是有區別的。

1. 表級鎖定(table-level)

表級別的鎖定是mysql各儲存引擎中最大顆粒度的鎖定機制。該鎖定機制最大的特點是實現邏輯非常簡單,帶來的系統負面影響最小。所以獲取鎖和釋放鎖的速度很快。由於表級鎖一次會將整個表鎖定,所以可以很好的避免困擾我們的死鎖問題。

當然,鎖定顆粒度大所帶來最大的負面影響就是出現鎖定資源爭用的概率也會最高,致使並大度大打折扣。

使用表級鎖定的主要是myisam,innodb,bdb,memory,csv等一些非事務性儲存引擎。

2. 行級鎖定(row-level)

行級鎖定最大的特點就是鎖定物件的顆粒度很小,也是目前各大資料庫管理軟體所實現的鎖定顆粒度最小的。由於鎖定顆粒度很小,所以發生鎖定資源爭用的概率也最小,能夠給予應用程式盡可能大的併發處理能力而提高一些需要高併發應用系統的整體效能。

雖然能夠在併發處理能力上面有較大的優勢,但是行級鎖定也因此帶來了不少弊端。由於鎖定資源的顆粒度很小,所以每次獲取鎖和釋放鎖需要做的事情也更多,帶來的消耗自然也就更大了。此外,行級鎖定也最容易發生死鎖。

使用行級鎖定的主要是innodb儲存引擎。

3. 頁級鎖定(page-level)

頁級鎖定是mysql中比較獨特的一種鎖定級別,在其他資料庫管理軟體中也並不是太常見。頁級鎖定的特點是鎖定顆粒度介於行級鎖定與表級鎖之間,所以獲取鎖定所需要的資源開銷,以及所能提供的併發處理能力也同樣是介於上面二者之間。另外,頁級鎖定和行級鎖定一樣,會發生死鎖。

在資料庫實現資源鎖定的過程中,隨著鎖定資源顆粒度的減小,鎖定相同資料量的資料所需要消耗的記憶體數量是越來越多的,實現演算法也會越來越複雜。不過,隨著鎖定資源顆粒度的減小,應用程式的訪問請求遇到鎖等待的可能性也會隨之降低,系統整體併發度也隨之提公升。

使用頁級鎖定的主要是berkeleydb(bdb)儲存引擎。

考慮到行級鎖定君由各個儲存引擎自行實現,而且具體實現也各有差別,而innodb是目前事務型儲存引擎中使用最為廣泛的儲存引擎,所以這裡我們就主要分析一下innodb的鎖定特性。其實innodb的鎖定機制和oracle資料庫有不少相似之處。

鎖模式

innodb的行級鎖定同樣分為兩種型別:共享鎖和排他鎖,而在鎖定機制的實現過程中為了讓行級鎖定和表級鎖定共存,innodb也同樣使用了意向鎖(表級鎖定)的概念,也就有了意向共享鎖和意向排他鎖這兩種。

意向鎖的作用就是當乙個事務在需要獲取資源鎖定的時候,如果遇到自己需要的資源已經被排他鎖占用的時候,該事務可以需要鎖定行的表上面新增乙個合適的意向鎖。如果自己需要乙個共享鎖,那麼就在表上面新增乙個意向共享鎖。而如果自己需要的是某行(或者某些行)上面新增乙個排他鎖的話,則先在表上面新增乙個意向排他鎖。

意向共享鎖可以同時並存多個,但是意向排他鎖同時只能有乙個存在。所以,可以說innodb的鎖定模式實際上可以分為四種:共享鎖(s),排他鎖(x),意向共享鎖(is)和意向排他鎖(ix)

隱式加鎖:

innodb行鎖的實現方式——索引加鎖

innodb行鎖是通過給索引上的索引項加鎖來實現的,只有通過索引條件檢索資料,innodb才使用行級鎖,如果沒有索引,innodb會通過隱藏的聚簇索引來對記錄進行加鎖(全表掃瞄,也就是表鎖)。

但是,為了效率考量,mysql做了優化,對於不滿足條件的記錄,會放鎖,最終持有的,是滿足條件的記錄上的鎖。但是不滿足條件的記錄上的加鎖/放鎖動作是不會省略的。所以在沒有索引時,不滿足條件的資料行會有加鎖又放鎖的耗時過程。

在實際應用中,要特別注意innodb行鎖的這一特性,不然的話,可能導致大量的鎖衝突,從而影響併發效能。下面通過一些實際例子來加以說明。

在不通過索引條件查詢的時候,innodb確實使用的是表鎖,而不是行鎖。

由於mysql的行鎖是針對索引加的鎖,不是針對記錄加的鎖,所以雖然是訪問不同行的記錄,但是如果是使用相同的索引鍵,是會出現鎖衝突的。

當表有多個索引的時候,不同的事務可以使用不同的索引鎖定不同的行,另外,不論是使用主鍵索引、唯一索引或普通索引,innodb都會使用行鎖來對資料加鎖。

即便在條件中使用了索引字段,但是否使用索引來檢索資料是由mysql通過判斷不同執行計畫的代價來決定的,如果mysql認為全表掃瞄效率更高,比如對一些很小的表,它就不會使用索引,這種情況下innodb將使用表鎖,而不是行鎖。因此,在分析鎖衝突時,別忘了檢查sql的執行計畫,以確認是否真正使用了索引。

間隙鎖(next-key鎖)

innodb的鎖定規則是當我們用範圍條件而不是相等條件檢索資料時,通過在符合條件的間隙上標記鎖定資訊而實現的。 innodb的這種鎖定實現方式被稱為「 next-key locking」 (間隙鎖),因為query執行過程中通過範圍查詢的話,它會鎖定整個範圍內所有的索引鍵值,即使這個鍵值並不存在。

例:假如emp表中只有101條記錄,其empid的值分別是 1,2,…,100,101,下面的sql:

mysql>

select

*from emp where empid >

100for

update

;

乙個範圍條件的檢索,innodb不僅會對符合條件的empid值為101的記錄加鎖,也會對empid大於101(這些記錄並不存在)的「間隙」加鎖。

間隙鎖的缺點:

MySQL行級鎖 表級鎖 頁級鎖

mysql資料庫由於其自身架構的特點,存在多種資料儲存引擎,每種儲存引擎所針對的應用場景特點都不太一樣,為了滿足各自特定應用場景的需求,每種儲存引擎的鎖定機制都是為各自所面對的特定場景而優化設計,所以各儲存引擎的鎖定機制也有較大區別。mysql各儲存引擎使用了三種型別 級別 的鎖定機制 表級鎖定,行...

mysql的行級鎖 表級鎖 頁級鎖

鎖是在執行多執行緒時用於強行限制資源訪問的同步機制,即用於在併發控制中保證對互斥要求的滿足 行級鎖 是mysql中鎖定粒度最細的一種鎖,表示只針對當前操作的行進行加鎖。行級鎖能大大減少資料庫操作的衝突。其加鎖粒度最小,但加鎖的開銷也最大。行級鎖分為共享鎖和排他鎖 特點 開銷大,加鎖慢,會出現死鎖 鎖...

MySQL中的行級鎖,表級鎖,頁級鎖

在電腦科學中,鎖是在執行多執行緒時用於強行限制資源訪問的同步機制,即用於在併發控制中保證對互斥要求的滿足。在資料庫的dbms中,可以按照鎖的粒度把資料庫鎖分為行級鎖 innodb引擎 表級鎖 myisam引擎 和頁級鎖 bdb引擎 行級鎖是mysql中鎖定粒度最細的一種鎖,表示只針對當前操作的行進行...