關於mysql資料庫引擎MyIsam的表鎖理解

來源:互聯網
上載者:User

標籤:http   unlock   ref   pop   運行   .net   釋放   修改   也會   

MySQL中的鎖概念

MySQL中不同的儲存引擎支援不同的鎖機制。比如MyISAM和MEMORY儲存引擎採用的表級鎖,BDB採用的是頁面鎖,也支援表級鎖,InnoDB儲存引擎既支援行級鎖,也支援表級鎖,預設情況下採用行級鎖。

Mysql3中鎖特性如下:

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

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

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

MyISAM表索1.查詢表級鎖爭用情況

通過檢查table_locks_waited和table_locks_immediate狀態變數分析系統上表鎖爭奪情況


table_locks_waited鎖定等待時間越長,則說明存在較嚴重的表層級鎖爭用情況。

2.鎖模式mysql的表鎖有兩種模式:表共用讀鎖(table read lock)和表獨佔寫鎖(table write lock)
說明 1.myISAM表的讀操作,不會阻塞其他使用者對同一個表的讀請求,但會阻塞對同一個表的寫請求。     2.myISAM表的寫操作,會阻塞其他使用者對同一個表的讀和寫操作。        3.myISAM表的讀、寫操作之間、以及寫操作之間是串列的。執行個體如下,開啟了兩個會話,當t3處於讀鎖定時候,會話二可以檢索t3資料。當t3處於寫鎖定時候,會話二隻有等到解鎖後,才能顯示資料(可以對比檢索時間)。
3.加表鎖MyISAM在執行查詢前,會自動執行表的加鎖、解鎖操作,一般情況下不需要使用者手動加、解鎖,但是有的時候也需要顯示加鎖。比如:檢索某一個時刻t1,t2表中資料數量。常用代碼如下:select count(t1.id1) as ‘sum‘ from t1;select count(t2.id1) as ‘sum‘ from t2;
其實這是不正確的,很有可能當你在檢索t1的那個時間點,t2的資料已經發生了變化,也就是說你檢查出的t1和t2資料結果不是在同一個時間點上。正確的做法是: [sql] view plain copy
  1. lock table t1 read, t2 read;  
  2. select count(t1.id1) as ‘sum‘ from t1;  
  3. select count(t2.id1) as ‘sum‘ from t2;  
  4. unlock tables;  

當然也可使用union,這樣寫: [sql] view plain copy
  1. SELECT   
  2.   COUNT(t1.`id1`) AS dadasum,‘t1‘ AS tablename  
  3. FROM  
  4.   t1  
  5. UNION  
  6. ALL   
  7. SELECT   
  8.   COUNT(t2.`id1`)AS dadasum ,‘t2‘ AS tablename  
  9. FROM  
  10.   t2 ;  
注意事項1.在鎖定表時候,如果加上關鍵字local,滿足myISAM表的並發插入問題。eg: lock table t3 read local;2.使用locak tables 給表加鎖時候,必須同時給所有涉及到的表加鎖,因為加鎖之後,當前會話,就不能操作沒有加鎖的表。4.並發插入問題myISAM儲存引擎有一個系統變數,concurrent_insert,專門用來控制並發插入行為的,值可以為0,1,2.concurrent_insert為0時候,不允許插入
concurrent_insert為1時候,如果mysql沒有空洞(中間沒有被刪除的行),myISAM運行一個進程讀表的時候,另一個進程從表尾插入記錄,這也是mysql預設設定。concurrent_insert為2時候,無論MyISAM表中有沒有空洞,都允許在表尾並行的插入。
5.myISAM鎖調度問題MyISAM儲存引擎的讀鎖和寫鎖是互斥的,讀寫操作室串列的,那麼如果讀寫兩個進程同時請求同一張表,Mysql將會使寫進程先獲得鎖。不僅僅如此,即使讀請求先到達鎖等待隊列,寫鎖後到達,寫鎖也會先執行。因為mysql因為寫請求比讀請求更加重要。這也正是MyISAM不適合含有大量更新操作和查詢操作應用的原因。調節辦法:1)通過指定啟動參數low-priority-updates,使MyISAM引擎預設給與讀請求優先的許可權2)通過執行set low_PRIORITY_UPDATES=1,降低更新要求的優先順序。3)指定INSERT、UPDATE、DELETE語句的LOW_PRIORITY屬性。InnoDB鎖1.InnoDB與MyISAM最大不同有兩點: 1).支援事務 2).採用行級鎖2.查看InnoDB行鎖爭用情況
3.innodb行鎖模式以及加鎖方法innoDB實現了以先兩種類型的行鎖:共用鎖定(S):允許一個事務去讀一行,阻止其他事務擷取相同資料集的獨佔鎖定。獨佔鎖定(X):允許獲得獨佔鎖定的事務更新資料,阻止其他事務取得相同資料集的共用讀鎖和排他寫鎖。先兩種意向表鎖:
意向同享鎖意向獨佔鎖定

如果一個事務請求的鎖模式與當前的鎖模式相容,innodb就將請求的鎖授予該事務;反之,如果兩者不相容,該事務就要等待鎖釋放。意圖鎖定是Innodb自動加的,不需要使用者幹預。對於UPDATE、DELETE、INSERT語句,Innodb會自動給涉及的資料集加獨佔鎖定(X);對於普通SELECT語句,Innodb不會加任何鎖。
顯示添加鎖共用鎖定(S) : SELECT * FROM table_name WHERE .... LOCK IN SHARE MODE獨佔鎖定(X):  SELECT * FROM table_name WHERE .... FOR UPDATE.使用select ... in share mode擷取共用鎖定,主要用在需要資料依存關係時,確認某行記錄是否存在,並確保沒有人對這個記錄進行update或者delete。4.InnoDB行鎖實現方式InnoDB行鎖是通過給索引上的索引項目加鎖來實現的,這一點MySQL與Oracle不同,後者是通過再資料區塊中,對相應資料行加鎖來實現的。InnoDB這種行鎖實現特點意味著:只有通過索引條件檢索資料,innoDB才使用行級鎖,否則InnoDB將使用表鎖,在實際開發中應當注意。執行個體一:建立t1表如下: [sql] view plain copy
  1. CREATE TABLE `t1` (  
  2.   `id1` int(5) DEFAULT NULL,  
  3.   `id2` int(3) unsigned zerofill NOT NULL DEFAULT ‘000‘  
  4. ) ENGINE=InnoDB DEFAULT CHARSET=utf8  
[sql] view plain copy
  1. <span style="font-size:18px;">insert into t1 valuses(1,1),(2,2);</span>  


因為沒有建立索引,當給第一個會話添加索引時候,其實添加的是表索引,而非行索引,因為第二會話在查詢其他資訊時候,一直處於等待狀態,最後逾時,直到第一個會話事務提交後,方可查詢。(需要先設定 set autocommit=0)執行個體二:修改上面t1表中資料,資料如下
給id1添加索引ALTER TABLE t1 ADD INDEX id1(id1);

有此可以看出此時,mysql使用的是行索引。但是還有一個需要我們注意
很明顯兩個會話查詢的不是同一行記錄,為什麼會話2仍然需要等待會話1提交之後才能查詢呢?還是因為Mysql行鎖是針對索引加的鎖,不是針對記錄加的鎖,索引雖然訪問不同的記錄,但是他們的索引相同,是會出現衝突的,在設計資料庫時候需要注意這一點。上面只有將欄位id2,也添加上索引才能解決衝突問題。這也是mysql效率低的一個原因。 【 本文轉載自:http://blog.csdn.net/hsd2012/article/details/51112009 】

關於mysql資料庫引擎MyIsam的表鎖理解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.