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语句。
相关文章
相关标签/搜索