前言
早上到公司,发现测试环境一直记载不出来数据,排查后发现是mysql lock的问题,每次执行一条update语句,都会提示等待锁超时,根据这条sql定位到出现问题的表。
昨天晚上走还是好好的QAQ。
分析
我这边使用的是 MySQL 数据库,出现问题的表的引擎是 InnoDB 表类型,当发生竞争时会出现锁等待的情况。
在出现锁等待时,会根据参数 innodb_lock_wait_timeout(默认50s)的配置,判断是否需要进行 timeout 的操作,如果等待时间超过了设置的时间就会报错。
MySQL 执行 UPDATE 语句很慢并出现 Lock wait timeout exceeded; try restarting transaction 错误,通常是由锁竞争、长事务、索引问题或其他性能瓶颈导致的。
根据这一情况,网上的说法:
1、多台服务器同时操作同一数据库。
2、在同一事务内先后对同一条数据进行插入和更新操作。
3、同时对同一张表进行插入和更新操作。
4、事务A对记录C进行更新/删除操作的请求未commit时,事务B也对记录C进行更新/删除操作。此时,B会等A提交事务,释放行锁。当等待时间超过innodb_lock_wait_timeout设