记录项目中的锁等待超时Lock wait timeout exceeded——事务与索引

问题描述

项目中突然报错,主要是两个,一个是任务脚本执行时间过长,另一个是锁等待时间过长,如下

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表数据;
		}
	}
	事务结束;
}

原因主要是事务加的位置有问题,并且数据表没有对应索引,导致更新时间过长。

任务执

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值