mysql锁超时排查_【BUG12】排查解决一个锁超时 "MySQLTransactionRollbackException: Lock wait timeout exceeded; try rest...

排查

报错日志

org.springframework.dao.CannotAcquireLockException:

### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction

### The error may involve defaultParameterMap

### The error occurred while setting parameters

### SQL: delete from yc_data_storage where data_obj_id in ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ) and `is_deleted` = 0 and DATE_FORMAT(data_time,%Y-%m-%d)=?

### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction ; SQL []; Lock wait timeout exceeded; try restarting transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded;

try restarting transaction at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:258) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:74) at

发生业务场景

用户上传文件后,触发某任务,该任务分为清洗和计算两步骤

并发时可能会触发该问题

如:用户A先上传,先清洗后计算,该计算需要花费长达数十分钟,计算过程中存在大量的DB数据读取和写入;在用户A的任务计算中,用户再上传跑新的任务,触发新的清洗工作,新的清洗工作会调用delete操作请求锁表(由于没走索引导致锁表请求直到超时——Lock wait timeout exceeded)

超时日志截图 (错误截图)

e9322d64cb282ff17adacb5173181841.png

看了代码后,截图截错了,并不是超时错误;

该截图下很长一段代码没有主动logger,所以并没有日志打印;

具体的单个db操作很快,不足以超时。

看一下数据库的锁请求的超时时间

# 查询全局等待事务锁超时时间

SHOW GLOBAL VARIABLES LIKE 'innodb_lock_wait_timeout';

27b0c846619deb4a50ea1cbadc3962cf.png

处理措施

预估下表的数据规模

c4d990a5d028eea3c75f3bb7a50f3b40.png

当前两年的数据为2M行,未来十年预估在千万行以内。

问题不大。

增加联合索引,更改sql确定走了索引,重新Explain一下上面的超时的SQL

7ce547b33e1219482c57aac1f9021733.png

delete操作走了索引,每次delete更新就只更新索引树,不会再引起等待超时的问题了。

另一方面,加了索引后,存储和执行的速度得到有效提升;效果如下:

934c853e31ef976a8225301088fabdc6.png

1f39d801b7f147e0b0ef507d1d003591.png

确保增删改查都走索引:

### SQL: delete from yc_data_storage where data_obj_id in ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ) and `is_deleted` = 0 and DATE_FORMAT(data_time,%Y-%m-%d)=?

上面的这个异常log里的日志的sql使用了DATE_FORMAT,及时加了索引也会导致索引失效。

分区与索引的考虑

分区和索引可以一起加上。

data_time列为分区,分区可以有效缓解数据膨胀,索引可以在一定程度中提升索引速度。

f0a86b25c4c78333666de6eb32a223d2.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值