在計算機的世界裏鎖(lock)是爲了協調多個進程或者多個線程併發的訪問同一資源而被創造出來的。而在咱們的mysql數據庫中的鎖也是爲了解決併發訪問同一資源的問題,下面我就來介紹下mysql中的鎖的一些知識,若是有什麼說的不對的地方,還但願各位大神指正。mysql
在mysql數據庫中,能夠將鎖分爲3個種類: 表級鎖 、 行級鎖 、 頁級鎖 。sql
定義:對整個表進行加鎖處理,在你鎖按期間,若是你是讀鎖,其餘進程寫操做沒法對這張表進行操做。若是你是寫鎖,則其餘進程沒法對這張表進行操做。數據庫
引擎: MyISAM , InnoDB 併發
優勢: 加鎖快 、 開銷小 、 不會出現死鎖 spa
缺點: 鎖定面積大 、 發生衝突的機率高 、 併發度低 線程
lock tables table_name1 read local,table_name2 read local; select * from table_name1; select * from table_name2; lock tables;
注意:code
MyISAM存儲引擎中有一個系統變量 concurrent_insert ,這個變量能夠控制併發插入的行爲,容許的值爲(0、一、2)。blog
對於MyISAM的鎖調度,咱們須要注意的是:索引
優勢:由於MyISAM是共享讀鎖的,先執行寫進程,可讓讀進程積累到必定程度,一塊兒讀取數據,能夠增長併發度隊列
缺點:若是寫進程過多,那麼會形成讀進程一致沒法執行,致使等待時間過長
能夠經過如下幾種方法解決讀進程等待時間過長的問題:
SET LOW_PRIORITY_UPDATES=1; SET LOW_PRIORITY_INSERT=1; SET LOW_PRIORITY_DELETE=1;
set max_write_lock_count=10;
定義:對錶中的一行進行加鎖,其餘進程還能夠操做這張表的其餘行。
引擎: InnoDB
優勢: 鎖定面積小 、 發生衝突的機率低 、 併發度高
缺點: 加鎖慢 、 開銷大 、 會發生死鎖
注意如下幾點:
select * from table_name where id = xxx lock in share mode;
InnoDB行鎖是經過索引上的索引項來實現的,只有經過索引條件檢索數據,InnoDB纔會使用行級鎖,不然,InnoDB將使用表鎖。
當咱們用範圍條件而不是相等條件檢索數據,並請求共享或排他鎖時,InnoDB會給符合條件的已有數據的索引項加鎖;對於鍵值在條件範圍內但並不存在的記錄,叫作「間隙(GAP)」,InnoDB也會對這個「間隙」加鎖,這種鎖機制不是所謂的間隙鎖(Next-Key鎖)。
在InnoDB下,使用表鎖要注意如下幾點:
定義:對錶中某行和相鄰行進行加鎖。這種作法是對錶級鎖和行級鎖的一中折中方案。
引擎:BDB