mysql的鎖原理

myisam:
只有表鎖,分爲表共享讀鎖,表排他寫鎖。不支持事務
表共享讀鎖:session1:lock table a read ; 此session1能對只能對a表讀,其餘都幹不了,其餘的session能對這個表讀。直到unlock tables;
表排他鎖:session1:lock table a write; 此session1能對a表進行update,insert,select,delete; 其餘的session對這個表什麼都幹不了;
myisam在執行查詢語句(SELECT)前,會自動給涉及的全部表加讀鎖,在執行更新操做 (UPDATE、DELETE、INSERT等)前,會自動給涉及的表加寫鎖,這個過程並不須要用戶干預,所以,用戶通常不須要直接用LOCK TABLE命令給MyISAM表顯式加鎖。
LOCK TABLE時加了「local」選項,其做用就是在知足MyISAM表併發插入條件的狀況下,容許其餘用戶在表尾併發插入記錄並不是插入(lock table a read local的時候):
當concurrent_insert設置爲0時,不容許併發插入。
當concurrent_insert設置爲1時,若是MyISAM表中沒有空洞(即表的中間沒有被刪除的行),MyISAM容許在一個進程讀表的同時,另外一個進程從表尾插入記錄。這也是MySQL的默認設置。
當concurrent_insert設置爲2時,不管MyISAM表中有沒有空洞,都容許在表尾併發插入記錄。
myisam:讀鎖和寫鎖是串行的,老是寫鎖先得到資源。就算是讀鎖先排隊的,寫鎖後排隊的,同樣時寫鎖得到資源

innodb:支持事務,有表鎖,行鎖 
行鎖:排他鎖,共享鎖
共享鎖:又稱讀鎖。容許一個事務去讀一行,阻止其餘事務得到相同數據集的排他鎖。session1對數據a加了共享鎖,session1只能對a讀不能更改,其餘session也只能對a加共享鎖去讀,不能加排他鎖。
排他鎖:又稱寫鎖。排他鎖指的是一個事務在一行數據加上排他鎖後,其餘事務不能再在其上加其餘的鎖。session1對a加了排他鎖,session1能對a更改,其餘session不能再對a加任何的鎖。可是由於select默認不加任何鎖,因此能夠select
InnoDB引擎默認的修改數據語句:update,delete,insert都會自動給涉及到的數據加上排他鎖,select語句默認不會加任何鎖類型,若是加排他鎖可使用select …for update語句,加共享鎖可使用select … lock in share mode語句。
相關文章
相關標籤/搜索