mysql資料庫鎖定機制

2021-06-18 09:30:41 字數 2808 閱讀 8133

為了保證資料的一致完整性,任何乙個資料庫都存在鎖定機制。鎖定機制的優劣直接應想到乙個資料庫系統的併發處理能力和效能,所以鎖定機制的實現也就成為了各種資料庫的核心技術之一。下面將對 mysql 的 innodb 各自的鎖定機制進行較為詳細的分析。

總的來說, mysql 各儲存引擎使用了三種型別(級別)的鎖定機制:行級鎖定,頁級鎖定和表級鎖定。下面我們先分析一下 mysql 這三種鎖定的特點和各自的優劣所在。

● 行級鎖定( row-level )

行級鎖定最大的特點就是鎖定物件的顆粒度很小,也是目前各大資料庫管理軟體所實現的鎖定顆粒度最小的。由於鎖定顆粒度很小,所以發生鎖定資源爭用的概率也最小,能夠給予應用程式盡可能大的併發處理能力而提高一些需要高併發應用系統的整體效能。雖然能夠在併發處理能力上面有較大的優勢,但是行級鎖定也因此帶來了不少弊端。由於鎖定資源的顆粒度很小,所以每次獲取鎖和釋放鎖需要做的事情也更多,帶來的消耗自然也就更大了。此外,行級鎖定也最容易發生死鎖。

● 表級鎖定( table-level )

和行級鎖定相反,表級別的鎖定是 mysql 各儲存引擎中最大顆粒度的鎖定機制。該鎖定機制最大的特點是實現邏輯非常簡單,帶來的系統負面影響最小。所以獲取鎖和釋放鎖的速度很快。由於表級鎖一次會將整個表鎖定,所以可以很好的避免困擾我們的死鎖問題。當然,鎖定顆粒度大所帶來最大的負面影響就是出現鎖定資源爭用的概率也會最高,致使並大度大打折扣。

● 頁級鎖定( page-level )

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

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

在 mysql 資料庫中,使用表級鎖定的主要是 myisam , memory , csv 等一些非事務性儲存引擎,而使 用行級鎖定的主要是 innodb 儲存引擎和 ndb cluster 儲存引擎,頁級鎖定主要是 berkeleydb 儲存引擎的 鎖定方式。

鎖定機制分析:

表級鎖定

mysql 的表級鎖定主要分為兩種型別,一種是讀鎖定,另一種是寫鎖定。在 mysql 中,主要通過四 個佇列來維護這兩種鎖定:兩個存放當前正在鎖定中的讀和寫鎖定資訊,另外兩個存放等待中的讀寫鎖定資訊,如下:

• current read-lock queue (lock->read)

• pending read-lock queue (lock->read_wait)

• current write-lock queue (lock->write)

• pending write-lock queue (lock->write_wait)

innodb 鎖定模式及實現機制

innodb 的鎖定機制和 oracle 資料庫有不少相似之處。 innodb 的行級鎖定同樣分為兩種 型別,共享鎖和排他鎖,而在鎖定機制的實現過程中為了讓行級鎖定和表級鎖定共存, innodb 也同樣使用了意向鎖(表級鎖定)的概念,也就有了意向共享鎖和意向排他鎖這兩種。當乙個事務需要給自己需要的某個資源加鎖的時候,如果遇到乙個共享鎖正鎖定著自己需要的資源的時候,自己可以再加乙個共享鎖,不過不能加排他鎖。但是,如果遇到自己需要鎖定的資源已經被乙個排他鎖占有之後,則只能等待該鎖定釋放資源之後自己才能獲取鎖定資源並新增自己的鎖定。 而意向鎖的作用就是當乙個事務在需要獲取資源鎖定的時候,如果遇到自己需要的資源已經被排他鎖占用的時候,該事務可以需要鎖定行的表上面新增乙個合適的意向鎖。如果自己需要乙個共享鎖,那麼就在表上面新增乙個意向共享鎖。而如果自己需要的是某行(或者某些行)上面 新增乙個排他鎖的話,則先在表上面新增乙個意向排他鎖。意向共享鎖可以同時並存多個,但是意向排他鎖同時只能有乙個存在。所以,可以說 innodb 的鎖定模式實際上可以分為四種:共享鎖( s ),排他鎖( x ),意向共享鎖( is )和意向排他鎖( ix ),我們可以通過以下**來總結上面這四種所的共存邏輯關係:

除了間隙鎖給 innodb 帶來效能的負面影響之外,通過索引實現鎖定的方式還存在其他幾個較大的效能隱患:

● 當 query 無法利用索引的時候, innodb 會放棄使用行級別鎖定而改用表級別的鎖定,造成併發效能的降低;

● 當 quuery 使用的索引並不包含所有過濾條件的時候,資料檢索使用到的索引鍵所只想的資料可能有部分並不屬於該 query 的結果集的行列,但是也會被鎖定,因為間隙鎖鎖定的是乙個範圍,而不是具體的索引鍵;

● 當 query 在使用索引定位資料的時候,如果使用的索引鍵一樣但訪問的資料行不同的時候(索引只是過濾條件的一部分),一樣會被鎖定

在 innodb 中當系檢測到死鎖產生之後是如何來處理的:

在 innodb 的事務管理和鎖定機制中,有專門檢測死鎖的機制,會在系統中產生死鎖之後的很短時間內就檢測到該死鎖的存在。當 innodb 檢測到系統中產生了死鎖之後, innodb 會通過相應的判斷來選這 產生死鎖的兩個事務中較小的事務來回滾,而讓另外乙個較大的事務成功完成。那 innodb 是以什麼來為標準判定事務的大小的呢? mysql 官方手冊中也提到了這個問題,實際上在 innodb 發現死鎖之後,會計算出兩個事務各自插入、更新或者刪除的資料量來判定兩個事務的大小。也就是說哪個事務所改變的記錄條數越多,在死鎖中就越不會被回 滾掉。但是有一點需要注意的就是,當產生死鎖的場景中涉及到不止innodb 儲存引擎的時候, innodb 是沒辦法檢測到該死鎖的,這時候就只能通過鎖定超時限制來解決該死鎖了。

mysql的鎖定機制 MySQL鎖定機制

一 樂觀鎖與悲觀鎖 1.1 樂觀鎖與使用版本號實現樂觀鎖 樂觀鎖假設認為資料一般情況下不會造成衝突,所以在資料進行提交更新的時候,才會正式對資料的衝突與否進行檢測,如果發現衝突了,則對使用者返回錯誤資訊,讓使用者決定如何去處理。實現方式為版本號和時間戳。使用版本號時,可以在資料初始化時指定乙個版本號...

mysql鎖定機制

標籤 空格分隔 mysql 鎖 mysql對於不同儲存引擎支援不同的鎖定機制,myisam和memory儲存引擎採用的是表級鎖 innodb採用行級鎖,也支援表級鎖 bdb儲存引擎採用的是頁級鎖同時也支援表級鎖。行級鎖最大特點是鎖定物件的粒度很小,發生資源競爭的概率就比較小,故而能提高較大的併發處理...

資料庫鎖定

在很多客戶一起查詢資料表時,如果使客戶能最快地查詢到資料就是排程和鎖定做的工作了。在mysql中,我們把select操作叫做讀,把對資料表修改增加的操作 insert,update,replace.叫做寫。mysql的基本排程策略可以歸納為以下兩條 寫入請求將按它們到達伺服器的順序進行處理 寫操作的...