面试题答案
一键面试锁类型
- MyISAM:只有表级锁,即对整个表进行锁定。分为读锁(共享锁)和写锁(排他锁)。
- InnoDB:支持行级锁、表级锁。行级锁又分为共享锁(S锁)和排他锁(X锁);表级锁有意向共享锁(IS锁)、意向排他锁(IX锁)等。
锁粒度
- MyISAM:锁粒度为表级,加锁和解锁的开销小,但并发性能差,因为一个事务对表加锁后,其他事务对该表的任何操作都需等待锁释放。
- InnoDB:锁粒度细,行级锁可针对具体行操作,在高并发场景下,多个事务可操作不同行,提高并发性能,但加锁和解锁开销相对大。
加锁时机
- MyISAM:在执行查询(SELECT)时,会对表加读锁;执行写操作(INSERT、UPDATE、DELETE)时,对表加写锁。
- InnoDB:
- 对于普通SELECT语句,默认不加锁,采用的是MVCC(多版本并发控制)来实现高并发读取。若要加锁,可使用SELECT ... FOR UPDATE 或 SELECT ... LOCK IN SHARE MODE语句。
- 执行INSERT、UPDATE、DELETE操作时,会自动对涉及的行加排他锁,同时会根据隔离级别等因素添加意向锁等表级锁来保证事务一致性。
释放时机
- MyISAM:在事务结束(COMMIT或ROLLBACK)或者连接关闭时释放锁。
- InnoDB:在事务结束(COMMIT或ROLLBACK)时释放锁。但在某些隔离级别下,锁可能提前释放,例如在READ COMMITTED隔离级别下,InnoDB会在语句执行完后释放非范围锁。
不同业务场景选择
- 高并发读场景:
- 选择MyISAM:MyISAM的表级读锁允许并发读操作,因为读锁是共享的,多个事务可同时对表进行读取,且表级锁开销小,适用于以读为主,写操作极少的场景,如新闻网站文章浏览等。
- 选择InnoDB:InnoDB的MVCC机制能实现高并发读,且读操作默认不加锁,性能也不错。如果读操作中有对数据一致性要求较高,需要加锁读的情况,InnoDB的行级锁能更细粒度控制,减少锁争用,比MyISAM更适合。例如银行账户余额查询等对数据一致性要求高的读操作场景。
- 高并发写场景:
- 选择MyISAM:MyISAM表级写锁会严重影响并发性能,因为同一时间只允许一个事务进行写操作,其他事务需等待,所以不适合高并发写场景。
- 选择InnoDB:InnoDB的行级锁允许不同事务对不同行进行写操作,大大提高并发写性能。例如电商系统的订单处理,多个订单可同时处理,减少等待时间。
- 读写混合场景:
- 选择MyISAM:由于MyISAM表级锁机制,读操作和写操作相互排斥,读写混合场景下,会频繁出现锁争用,性能较差,一般不适合。
- 选择InnoDB:InnoDB通过MVCC和行级锁,能较好平衡读写操作。读操作通过MVCC避免锁争用,写操作利用行级锁减少对读操作影响,适用于大多数读写混合场景,如社交平台的动态发布与浏览等场景。