一、分類 MySQL的鎖機制不同的存儲引擎支持不同的鎖機制,分為表級鎖、行級鎖、頁面鎖。MyISAM和MEMORY存儲引擎採用的是表級鎖(table-level locking);BDB存儲引擎採用的是頁面鎖(page-level locking),但也支持表級鎖;InnoDB存儲引擎既支持行級鎖( ...
一、分類
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這一行