7行锁

增么减少行锁对性能的影响?

引擎层实现行锁
MyISAM不支持行锁,只能用表锁控制并发,性能低
InnoDB支持行锁

两阶段行锁

事务开始时不加,使用时加,事务提交时释放

优化思路:合理安排事务语句顺序
把最可能造成锁冲突、影响并发度锁的申请时机往后放

死锁

循环等待资源

解决死锁

show engine innodb status 查看InnoDB引擎的状态信息LATEST DETECTED DEADLOCK部分查看死锁详情。
通过死锁日志分析死锁

超时机制

InnoDB innodb_lock_wait_timeout默认值50s
缺点:时间长无法等待

主动死锁检查

innodb_deadlock_detect默认值on
可以快速发现并处理,但有额外负担(消耗CPU)

1000个线程并发更新同一行,死锁检查数量级时100万级(每个线程都检查1000个线程000*1000)即使没有发生死锁,也消耗大量CPU。

如何解决热点行更新,主动检查导致的性能问题呢?

  • 关闭检查
    出现死锁的风险,出现后回滚,重试一般业务无损
    若出现大量超时,业务有损
  • (共享资源)并发度控制
    1. 修改MySQL引擎源码,对相同行更新进入引擎前排队
    2. 业务涉及优化,如将共享变量合理拆分,将并发请求分散
      如影院卖票,影院余额可设置多行记录累加,但须考虑退票,业务上需要详细设计。