MYSQL系列4-锁等待

长事务可能导致锁无法释放,引起其他事务等待,降低更新性能。行级锁和MDL锁是主要问题,可能导致死锁。解决方法包括调整innodb_lock_wait_timeout参数,启用innodb_deadlock_detect来检测并解决死锁。此外,应监控长事务并适时调整事务处理顺序,减少锁时间,避免系统性能下降。
摘要由CSDN通过智能技术生成
  1. 长事务的危害

  • 主要危害:锁无法释放

  1. 行级锁

  • 行级锁长时间无法释放,导致其他事务的等待。

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

  • 其他事务更新相同数据时会等待锁,造成更新性能差。

  • 解决办法:调整innodb_lock_wait_timeout参数,锁等待超时时间。默认值为50,即等待50秒后仍未获取到锁时,当前语句报错。如果等待时间过长,可适当缩短此参数。

  • 容易产生死锁。

  • 长事务的锁长时间不能事务,容易与其他事务产生死锁。

  • 死锁指的是两个事务都依赖对方的锁释放。

  • 解决办法:innodb_deadlock_detect,主动的死锁检测。默认开启该功能,发现死锁时回滚代价较小的事务。

  1. MDL锁(元数据锁)

  • MDL锁(元数据锁)hold住大量事务,造成Mysql奔溃。

  • 事务访问数据时,会自动给表增加MDL读锁。

  • 事务修改元数据时,会自动给表加MDL写锁。

  • 遇见锁不兼容时,申请MDL锁的事务会形成一个队列。

  • 示例:Tx A查询时获取到了MDL读锁,Tx B等带Tx A释放MDL读锁后增加MDL写锁,Tx C、D等待增加MDL读锁。

  • 解决办法

  • alter table之前,查看是否有长事务还未提交。

  • 查看长事务:information_schema库INNODB_TRX表。

  • 查看锁的情况。

  • information_schema库INNODB_LOCKS表。

  • 查看阻塞的事务。

  • information_schema库INNODB_LOCK_WAITS表。

  • Mysql 8.0新增performance_schema。

  • 查看锁的情况,data_locks表。

  • 查看锁等待,data_lock_waits表。

  • 查看MDL锁,metadata_locks表。

  1. 业务上的建议

  • 控制长事务,没必要情况下不开启事务。

  • 数据修改(当前读)尽量放在事务后面,降低锁时间。

  1. 总结

  • 长事务可能会造成行锁(死锁)、MDL锁等待。

  • 可以通过参数调整,降低锁影响。

  • 可以通过系统表识别长事务和锁。

  • 业务上尽量将加锁的操作后移动,降低锁时间。

来源:https://coding.imooc.com/learn/list/515.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值