mysql的鎖機制

2021-06-03 15:06:40 字數 2659 閱讀 7749

今天沒事就學習一下mysql的三種鎖機制的優缺點:

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

● 行級鎖定(row-level)

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

● 表級鎖定(table-level)

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

● 頁級鎖定(page-level)

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

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

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)

讀鎖定乙個新的客戶端請求在申請獲取讀鎖定資源的時候,需要滿足兩個條件:

1、請求鎖定的資源當前沒有被寫鎖定;

2、寫鎖定等待佇列(pending write-lock queue)中沒有更高優先順序的寫鎖定等待;

如果滿足了上面兩個條件之後,該請求會被立即通過,並將相關的資訊存入current read-lock queue 中,而如果上面兩個條件中任何乙個沒有滿足,都會被迫進入等待佇列pending read-lock queue中等待資源的釋放。

寫鎖定當客戶端請求寫鎖定的時候,mysql 首先檢查在current write-lock queue 是否已經有鎖定相同資源的資訊存在。如果current write-lock queue 沒有,則再檢查pending write-lock queue,如果在pending write-lock queue 中找到了,自己也需要進入等待佇列並暫停自身執行緒等待鎖定資源。反之,如果pending write-lock queue 為空,則再檢測current read-lock queue,如果有鎖定存在,則同樣需要進入pending write-lock queue 等待。當然,也可能遇到以下這兩種特殊情況:

1. 請求鎖定的型別為write_delayed;

2. 請求鎖定的型別為write_concurrent_insert 或者是tl_write_allow_write, 同時current read lock 是read_no_insert 的鎖定型別。

當遇到這兩種特殊情況的時候,寫鎖定會立即獲得而進入current write-lock queue 中如果剛開始第一次檢測就current write-lock queue 中已經存在了鎖定相同資源的寫鎖定存在,那麼就只能進入等待佇列等待相應資源鎖定的釋放了。讀請求和寫等待佇列中的寫鎖請求的優先順序規則主要為以下規則決定:

1. 除了read_high_priority 的讀鎖定之外,pending write-lock queue 中的write 寫鎖定能夠阻塞所有其他的讀鎖定;

2. read_high_priority 讀鎖定的請求能夠阻塞所有pending write-lock queue 中的寫鎖定;

3. 除了write 寫鎖定之外,pending write-lock queue 中的其他任何寫鎖定都比讀鎖定的優先順序低。

寫鎖定出現在current write-lock queue 之後,會阻塞除了以下情況下的所有其他鎖定的請求:

1. 在某些儲存引擎的允許下,可以允許乙個write_concurrent_insert 寫鎖定請求

2. 寫鎖定為write_allow_write 的時候,允許除了write_only 之外的所有讀和寫鎖定請求

3. 寫鎖定為write_allow_read 的時候,允許除了read_no_insert 之外的所有讀鎖定請求

4. 寫鎖定為write_delayed 的時候,允許除了read_no_insert 之外的所有讀鎖定請求

5. 寫鎖定為write_concurrent_insert 的時候,允許除了read_no_insert 之外的所有讀鎖定請求

mysql鎖機制 mysql 鎖機制

一 概述 mysql有三種鎖的級別 頁級 表級 行級。myisam和memory儲存引擎採用的是表級鎖 table level locking bdb儲存引擎採用的是頁面鎖 page level locking 但也支援表級鎖 innodb儲存引擎既支援行級鎖 row level locking 也...

mysql鎖機制 php Mysql鎖機制

表級鎖 開銷小,加鎖快 不會出現死鎖 鎖定粒度大,發生鎖衝突的概率最高,併發度最低。行級鎖 開銷大,加鎖慢 會出現死鎖 鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。共享鎖和排它鎖 頁面鎖 開銷和加鎖時間界於表鎖和行鎖之間 會出現死鎖 鎖定粒度界於表鎖和行鎖之間,併發度一般 mysql的行級鎖有...

mysql鎖機制總結 mysql鎖機制總結

1.隔離級別 1 讀不提交 read uncommited,ru 這種隔離級別下,事務間完全不隔離,會產生髒讀,可以讀取未提交的記錄,實際情況下不會使用。2 讀提交 read commited,rc 僅能讀取到已提交的記錄,這種隔離級別下,會存在幻讀現象,所謂幻讀是指在同乙個事務中,多次執行同乙個查...