一、MyISAM
说明:MyISAM不支持行锁
MySQL的表级锁有两种模式:
- 表共享读锁
- 表独占写锁
读锁会阻塞写,写锁会阻塞读和写
- 对MyISAM表的读操作,不会阻塞其它进程对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
- 对MyISAM表的写操作,会阻塞其它进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。
缺点:MyISAM不适合做写为主表的引擎,因为写锁后,其它线程不能做任何操作,大量的更新会使查询很难得到锁,从而造成永远阻塞
1)select:对于myisam的表select 是会锁定表的 ,会导致其他操作挂起,处于等待状态。MyISAM在执行查询语句(select)前,会自动给涉及的所有表加读锁
2)update,delete,insert:在执行增删改操作前,会自动给涉及的表加写锁。
二、InnoDB
说明:InnoDB支持行锁和表锁
1)select:对于innodb的表select 是不会锁表的。(其实这里使用到了快照)
2)update,delete:where中的过滤条件列,如果有索引且走了索引,锁行;如果没有索引或没有走索引,锁表。(注意有些索引没有生效也是会锁表的)
3)insert:可以并发执行,之间并不会相互影响,没有锁。