InnoDB 和 MyISAM 对比
- Innodb 支持崩溃恢复
- InnoDB 支持事务
- InnoDB 支持行锁
- B+Tree 叶子节点存储内容不同
- MyISAM 记录表行总数,InnoDB 没有
两阶段锁
InnoDB 读操作会使用 MVCC,而写操作会使用写锁。
InnoDB 两阶段锁协议:行锁是在需要的时候加上的,并且要等到事务提交后才释放。
减少锁冲突
根据二阶段锁协议,如果事务中需要锁多行,要把最可能造成锁冲突、最可能影响并发度的锁往后放。(减少锁的持有时间)
死锁和死锁检测
处理死锁的策略
- 等待超时
innodb_lock_wait_timeout
,默认值50秒 - 死锁检测
innodb_deadlock_detect=on
并回滚事务
死锁检测在高并发更新同一数据行会使用大量CPU,现象是 CPU 使用率很高,但每秒执行的事务却很少
- 如果业务一定不会出现死锁,可以关掉死锁检测(不推荐)
- 使用分布式 Semaphore 控制更新同一行并发度
- 将一行拆除逻辑的多行