【MySQL】mysql中的鎖機制

1、分類

MySQL的鎖機制不一樣的存儲引擎支持不一樣的鎖機制,分爲表級鎖、行級鎖、頁面鎖。MyISAM和MEMORY存儲引擎採用的是表級鎖(table-level locking);BDB存儲引擎採用的是頁面鎖(page-level locking),但也支持表級鎖;InnoDB存儲引擎既支持行級鎖(row-level locking),也支持表級鎖,但默認狀況下是採用行級鎖mysql

 

表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的機率最高,併發度最低。 
行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的機率最低,併發度也最高。 
頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,併發度通常 sql

2、表級鎖

MySQL的表級鎖有兩種模式:表共享讀鎖(Table Read Lock)表獨佔寫鎖(Table Write Lock)。 併發

對MyISAM表的讀操做,不會阻塞其餘用戶對同一表的讀請求,但會阻塞對同一表的寫請求;對 MyISAM表的寫操做,則會阻塞其餘用戶對同一表的讀和寫操做。spa

MyISAM在執行查詢語句(SELECT)前,會自動給涉及的全部表加讀鎖,在執行更新操做 (UPDATE、DELETE、INSERT等)前,會自動給涉及的表加寫鎖,這個過程並不須要用戶干預,所以,用戶通常不須要直接用LOCK TABLE命令給MyISAM表顯式加鎖。code

3、行級鎖

InnoDB與MyISAM的最大不一樣有兩點:一是支持事務(TRANSACTION);二是採用了行級鎖。blog

行級鎖也支持讀鎖和寫鎖兩類。索引

一、如何加鎖?

mysql InnoDB引擎默認的修改數據語句:update,delete,insert都會自動給涉及到的數據加上排他鎖,select語句默認不會加任何鎖類型,若是加排他鎖可使用select …for update語句,加共享鎖可使用select … lock in share mode語句。因此加過排他鎖的數據行在其餘事務種是不能修改數據的,也不能經過for update和lock in share mode鎖的方式查詢數據,但能夠直接經過select …from…查詢數據,由於普通查詢沒有任何鎖機制。事務

 二、實現原理

InnoDB行鎖是經過給索引上的索引項加鎖來實現的,這一點MySQL與Oracle不一樣,後者是經過在數據塊中對相應數據行加鎖來實現的。InnoDB這種行鎖實現特色意味着:只有經過索引條件檢索數據,並請求共享或排他鎖時,InnoDB才使用行級鎖,不然,InnoDB將使用表鎖! it

三、間隙鎖

當咱們用範圍條件檢索數據或者使用相等條件請求給一個不存在的記錄加鎖,並請求共享或排他鎖時,InnoDB會給符合條件的已有數據記錄的 索引項加鎖用範圍條件檢索數據table

舉例來講,假如表中只有5條記錄,其empid的值分別是一、二、三、六、7

Select * from  emp where id > 6 for update;
鎖定【6,無限大】區間

Select * from  emp where id=5 for update;
鎖定【36】區間

Select * from  emp where id=3 for update;
鎖定3這一行
相關文章
相關標籤/搜索