mysql 鎖機制一

2021-06-07 15:58:33 字數 3227 閱讀 8966

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

為了保證一致性,必須有鎖的介入。mysql操作緩衝池中的lru列表,刪除、新增、移動lru列表中的元素等地方也都適用鎖,從而允許對多種不同資源的併發訪問。

打個比方,我們到**上買一件商品,商品只有一件庫存,這個時候如果還有另乙個人買,那麼如何解決是你買到還是另乙個人買到的問題?

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

mysql的鎖管理機制:

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

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

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

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

上張圖:

mysql的鎖執行流程:

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

三種鎖地特性:

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

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

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

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

表鎖:

手動增加表鎖:

lock table *** read(write);

釋放表鎖:

表級鎖效能監控:

表級鎖的鎖模式:表共享讀鎖(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表中有沒有空洞,都允許在表尾併發插入記錄。

表鎖地優化:

使用表級鎖定在鎖定實現的過程中比實現行級鎖定或頁級鎖定所帶來的附加成本要小,鎖定本身所消耗的資源也是最少的。但是由於鎖定的顆粒度比較大,所以造成鎖定資源的爭用情況也會比其他的鎖定級別都要多,從而在較大程度上會降低併發處理能力。所以表鎖優化,最關鍵的是如何讓其提高併發度。由於鎖定級別是不可能改變的了,所以首先需要盡可能地鎖定的時間變短,然後就是讓可能併發進行的操作盡可能地併發。

1)儘量減少大的複雜的query,將複雜的query分拆成幾個小的query分步進行;

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

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

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

2、分離能並行的操作

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

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

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

以上筆記參考網路資料以及《mysql技術內幕:innodb儲存引擎》,如有謬誤請指正

mysql鎖機制 mysql 鎖機制

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

mysql 鎖機制(一)

介紹mysql 鎖的機制。鎖型別讀鎖,是一種共享鎖,s鎖,允許乙個事務是讀取一行,阻止其他事務獲取相同的資料集的排他鎖。假如事務a對資料項z進行s鎖,那麼事務b只能新增s鎖,而不能新增互斥鎖,也就是x鎖。這保證了,其他事務可以讀取z,但是在a的s鎖釋放之前,是不能進行任何修改的。寫鎖,是互斥鎖的一種...

mysql鎖機制 php Mysql鎖機制

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