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語句。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM