天天看點

【mysql】mysql中的鎖機制

【mysql】mysql中的鎖機制

一、分類

MySQL的鎖機制不同的存儲引擎支援不同的鎖機制,分為表級鎖、行級鎖、頁面鎖。MyISAM和MEMORY存儲引擎采用的是表級鎖(table-level locking);BDB存儲引擎采用的是頁面鎖(page-level locking),但也支援表級鎖;InnoDB存儲引擎既支援行級鎖(row-level locking),也支援表級鎖,但預設情況下是采用行級鎖

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

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

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

二、表級鎖

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

對MyISAM表的讀操作,不會阻塞其他使用者對同一表的讀請求,但會阻塞對同一表的寫請求;對 MyISAM表的寫操作,則會阻塞其他使用者對同一表的讀和寫操作。

MyISAM在執行查詢語句(SELECT)前,會自動給涉及的所有表加讀鎖,在執行更新操作 (UPDATE、DELETE、INSERT等)前,會自動給涉及的表加寫鎖,這個過程并不需要使用者幹預,是以,使用者一般不需要直接用LOCK TABLE指令給MyISAM表顯式加鎖。

三、行級鎖

InnoDB與MyISAM的最大不同有兩點:一是支援事務(TRANSACTION);二是采用了行級鎖。

行級鎖也支援讀鎖和寫鎖兩類。

1、如何加鎖?

mysql InnoDB引擎預設的修改資料語句:update,delete,insert都會自動給涉及到的資料加上排他鎖,select語句預設不會加任何鎖類型,如果加排他鎖可以使用select …for update語句,加共享鎖可以使用select … lock in share mode語句。是以加過排他鎖的資料行在其他事務種是不能修改資料的,也不能通過for update和lock in share mode鎖的方式查詢資料,但可以直接通過select …from…查詢資料,因為普通查詢沒有任何鎖機制。

2、實作原理

InnoDB行鎖是通過給索引上的索引項加鎖來實作的,這一點MySQL與Oracle不同,後者是通過在資料塊中對相應資料行加鎖來實作的。InnoDB這種行鎖實作特點意味着:隻有通過索引條件檢索資料,InnoDB才使用行級鎖,否則,InnoDB将使用表鎖!

3、間隙鎖

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

舉例來說,假如表中隻有5條記錄,其empid的值分别是1、2、3、6、7

複制代碼

Select * from emp where id > 6 for update;

鎖定【6,無限大】區間

Select * from emp where id=5 for update;

鎖定【3,6】區間

Select * from emp where id=3 for update;

鎖定3這一行

作者:leon66666

出處:

http://www.cnblogs.com/wangzhongqiu/