程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql的鎖機制

mysql的鎖機制

編輯:MySQL綜合教程

今天沒事就學習一下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 之外的所有讀鎖定請求

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved