MySQL锁等待导致连接数被打满处理分析
💡
原文中文,约3700字,阅读约需9分钟。
📝
内容提要
讨论MySQL中的行锁等待问题,导致数据库连接数和CPU占用率飙升。通过查看系统表和执行SQL语句,可以查看正在执行的事务、正在锁的事务和等待锁的事务。解决锁等待问题的方法包括使用合适的事务隔离级别、减少事务长度、避免频繁更新同一行数据、约定不同事务以相同顺序访问多行记录、及时提交或回滚事务、为表添加合适的索引等。
🎯
关键要点
- 线上服务日志报数据库连接过多,导致CPU占用率飙升。
- MySQL行锁等待问题导致连接数从100增至400,CPU占用率从4%升至100%。
- 行锁等待是由于业务update语句频繁重试造成的。
- MySQL使用InnoDB存储引擎实现行锁,通过MVCC技术管理事务。
- 事务在等待锁时可能会出现死锁,InnoDB会终止其中一个事务以继续执行。
- 可以通过查询information_schema中的系统表来查看事务状态和锁信息。
- 处理锁等待的步骤包括查询当前事务、锁和等待锁的事务。
- 为避免行锁等待,建议使用合适的事务隔离级别,减少事务长度,避免频繁更新同一行。
- 设计数据库时应约定不同事务以相同顺序访问多行记录,并及时提交或回滚事务。
- 表应添加合适的索引以减少锁竞争。
➡️