问题描述
项目中突然报错,主要是两个,一个是任务脚本执行时间过长,另一个是锁等待时间过长,如下
Lock wait timeout exceeded; try restarting transaction
该任务脚本用于做多个表之间的数据同步,同时,项目中还有多个脚本和其他代码有可能对表数据进行操作,产生锁。有两个表的数据量为百万级别,且数据项也比较多。
如果对死锁和锁等待不是很了解,可以快速跳到下面的链接,理解一下什么是锁等待,以及可能造成的原因。死锁和锁等待
问题分析
首先,先放出来这部分的伪代码吧(便于理解)
void method(){
事务开始;
while(true) {
List<ObjectA> list1 = 从A表按照条件拿出100条数据;
if(list1为空){ //如果为空,表示数据已经处理完毕,结束
return;
}
//依次操作ObjectA数据
for(ObjectA objectA: list1) {
删除A表数据;
与B表数据合并,并更新对应的数据;
同步C表数据;
}
}
事务结束;
}
原因主要是事务加的位置有问题,并且数据表没有对应索引,导致更新时间过长。