长事务有哪些危害?

主要危害:锁无法释放

  • 行级锁长时间无法释放,导致其他事务等待
  • 容易产生死锁
  • MDL锁hold住大量事务,造成MySQL奔溃

    行级锁长时间无法释放

  • 当前读会对数据行加锁,事务提交前无法提交

    解决方法

  • 调整innodb_lock_wait_timeout参数

  • 默认是50,即等待50秒还未获取锁,当前语句报错
  • 如果等待时间过长,可以适当缩短此参数

容易产生死锁

  • 长事务的锁长时间不释放,容易与其他事务产生死锁
  • 死锁指的是两个事务都依赖对方的锁的释放

image.png

解决方法

  • 主动死锁检测:innodb_deadlock_detect
  • 发现死锁时回滚代价较小的事务
  • 默认开启