MySQL的鎖機制

2021-09-07 02:20:12 字數 2639 閱讀 4264

鎖機制是資料庫系統區別於檔案系統的乙個關鍵特性,他可以確保使用者能以一致的方式讀取和修改資料。

為了保證一致性,必須有鎖的介入。mysql操作緩衝池中的lru列表,刪除、新增、移動lru列表中的元素等地方也都適用鎖,從而允許對多種不同資源的併發訪問。     打個比方,我們到**上買一件商品,商品只有一件庫存,這個時候如果還有另乙個人買,那麼如何解決是你買到還是另乙個人買到的問題?

這裡肯定要用到事物,我們先從庫存表中取出物品數量,然後插入訂單,付款後插入付款表資訊,然後更新商品數量。在這個過程中,使用鎖可以對有限的資源進行保護

,解決隔離和併發的矛盾。  

mysql的鎖管理機制: 

1. meta-data元資料鎖:在table cache快取裡實現的,為ddl(data definition language)提供隔離操作。一種特別的meta-data元資料型別,叫name lock。(sql層) 

2. 表級table-level資料鎖(sql層) 

3. 儲存引擎特有機制 — row locks行鎖,page locks頁鎖,table locks 表級,版本控制(在引擎中實現) 

4. 全域性讀鎖 — flush tables with read lock(sql層)

如下圖:

mysql三種鎖地級別:頁級、表級、行級。 

三種鎖地特性: 

表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的概率最高,併發度最低。  

行級鎖:開銷稍大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。  

頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,併發度一般。     

在執行sql語句時,會實現儲存引擎內部鎖,比如innodb儲存引擎的「行鎖」(myisam儲存引擎只支援表鎖,而innodb儲存引擎支援行鎖。實際上,行鎖並不總是會增加開         銷,只有當實現本身增加開銷時,行鎖才會增加開銷)。

表鎖: 

手動增加表鎖: lock table *** read(write); 

釋放表鎖:      unlock tables; 

表級鎖效能監控: 

如果table_locks_waited的值比較高,則說明存在著比較嚴重的表鎖爭用情況。

表級鎖的鎖模式:表共享讀鎖(table read lock)和 表獨佔寫鎖(table write lock)

myisam在執行查詢語句(select)前,會自動給涉及的所有表加讀鎖,在執行更新操作(update、delete、insert等)前,會自動給涉及的表加寫鎖。      所以對           myisam表進行操作,會有以下情況:  

a、對myisam表的讀操作(加讀鎖),不會阻塞其他程序對同一表的讀請求,但會阻塞對同一表的寫請求。只有當讀鎖釋放後,才會執行其它程序的寫操作。  

b、對myisam表的寫操作(加寫鎖),會阻塞其他程序對同一表的讀和寫操作,只有當寫鎖釋放後,才會執行其它程序的讀寫操作。 

簡而言之,就是讀鎖會阻塞寫,但是不會堵塞讀。而寫鎖則會把讀和寫都堵塞。

關於表鎖併發插入   

原則上資料表有乙個讀鎖時,其它程序無法對此表進行更新操作,但在一定條件下,myisam表也支援查詢和插入操作的併發進行。  

myisam儲存引擎有乙個系統變數concurrent_insert,專門用以控制其併發插入的行為,其值分別可以為0、1或2。  

a、當concurrent_insert設定為0時,不允許併發插入。  

b、當concurrent_insert設定為1時,如果myisam表中沒有空洞(即表的中間沒有被刪除的行),myisam允許在乙個程序讀表的同時,另乙個程序從表尾插入記錄。這也             是mysql的預設設定。  

c、當concurrent_insert設定為2時,無論myisam表中有沒有空洞,都允許在表尾併發插入記錄。

2)盡可能地建立足夠高效的索引,讓資料檢索更迅速; 

3)盡量讓myisam儲存引擎的表至存放必要的資訊,控制字段型別;     

4)利用合理的機會優化myisam表資料檔案。     

5)分離能並行的操作 

2.合理利用上面提到的concurrent_insert  

3.合理利用讀寫優先順序: 

myisam的表級鎖定對於讀和寫是有不同優先順序設定的,預設情況下是寫優先順序要大於讀。所以,可以根據系統環境的差異決定讀與寫的優先順序。如果系統是乙個以讀為主,而且要優先保證查詢效能的話,可以通過設定系統引數選項low_priority_updates=1,將寫的優先順序設定為比讀低,即告訴myisam盡量優先處理讀請求。當然,如果系統需要優先保證資料寫入的效能的話,則不用設定low_priority_updates引數了。

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 僅能讀取到已提交的記錄,這種隔離級別下,會存在幻讀現象,所謂幻讀是指在同乙個事務中,多次執行同乙個查...