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