区别
- MyISAM默认用的是表级锁,不支持行级锁(不支持事务)
- InnoDB默认用的是行级锁,也支持表记锁(支持事务)
读锁和写锁
理解
- 读锁:也称共享锁,即一个共享锁在执行时,另一个共享锁也可以执行,并不阻塞.
- 写锁:也称排他锁,当表加上了读锁或者写锁,需要等待它们释放才能加上新的写锁。
MyISAM
- 默认情况下 MyISAM的select加的是读锁,update,insert,delete增加的是写锁
select可以加写锁:即在select语句后加上 for update
如:select * from user for update
- 由于select的锁为读锁,所以在一个select时可以别的select并不阻塞,但update,insert,delete时阻塞(给整个表加锁)
- update,insert,delete的锁为写锁,在操作时别的操作阻塞(表级锁)
InnoDB
- InnoDB使用的是二段锁,即加锁和解锁是分两个步骤完成的,即先对同一个事务里的一批操作分别进行加锁,然后到commit的时候,在对事务里加上的锁进行统一的解锁
- InnoDB在没有用到索引时,使用表级锁.当走索引时,使用行级锁
- InnoDB对select进行了改进,select的操作并没有上锁
- select默认是非阻塞读(不上锁),其他默认上行级写锁
为select语句上共享锁 :select * from user lock in share mode
MyISAM和InnoDB的适用场景
MyISAM
频繁执行全表count语句
对数据增删改频率不高、查询较为频繁
没有事务
InnoDB
增删改查都很频繁
可靠性要求比较高,需要支持事务