事务超时

在面临定时任务中大量数据同步导致的事务超时问题时,通过将查询和插入操作拆分为两个方法并设置新的事务边界,成功避免了事务超时。在处理过程中遇到了部分插入失败、开发环境与测试环境差异以及事务只读状态错误。通过调整方法间的事务管理和加入延迟策略,最终实现了一个30秒内的事务执行,满足了MySQL的事务等待超时限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

情景:一个定时任务,每天凌晨同步某一张a表数据,其需要查询b表和调用其他平台接口,其同步的数据有将近3w条,此时写在一个事务中就出现了问题

且  MYSQL的事务超时时间没法改(其他项目也用,且因为一个功能就改数据库配置感觉不合理)

 

我的解决方法:

把查询的逻辑和删除插入的逻辑分别写在2个方法中 : sheducleDealBuildingRiskLevel 和  insertBafcBuildingRiskLevelList

@Transactional(rollbackFor = Exception.class)
public Boolean sheducleDealBuildingRiskLevel() 
@Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
private Boolean insertBafcBuildingRiskLevelList(List<BafcBuildingRiskLevel> bafcBuildingRiskLevelList){

//清空bafc_building_risk_level表
log.info("<<<<<<<<<<<<<<<<<<<清空bafc_building_risk_level表<<<<<<<<<<<<<<<<<<<<<<<<<<<");
delete(new EntityWrapper<>() );

log.info("<<<<<<<<<<<<<<<<<<<开始同步bafc_building_risk_level表<<<<<<<<<<<<<<<<<<<<<<<<<<<");
return  insertBatch(bafcBuildingRiskLevelList);   
}

遇到的问题:

1、只有部分insert sql有效   --- >>    同一事务执行时间已经超过数据库事务超时时间了innodb_lock_wait_timeout  --》   拆开成2个方法,且插入使用insertbatch

2、开发环境测试通过,测试环境无法插入 ---》》  打印具体日志,发现  调用块数据接口过于频繁  , 所以加入延时

3、报错 Error updating database. Cause: java.sql.SQLException: Could not retrieve transation read-only stat

方法1使用事务,方法2也使用事务,并设置 propagation = Propagation.REQUIRES_NEW ,插入时使用新事务

结果:插入总时间将近30S,小于innodb_lock_wait_timeout 的120S ,定时同步任务实现了

 

其他

https://blog.youkuaiyun.com/moshenglv/article/details/82179417?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161579281716780265470202%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=161579281716780265470202&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-6-82179417.first_rank_v2_pc_rank_v29_10&utm_term=%E5%9C%A8%E4%B8%80%E4%B8%AA%E4%BA%8B%E5%8A%A1%E4%B8%AD%E5%AE%8C%E6%88%90%E8%A7%A3%E6%9E%90%E4%B8%80%E4%B8%AA%E5%A4%A7%E6%96%87%E4%BB%B6%EF%BC%8C%E5%88%86%E6%89%B9%E5%AD%98%E5%85%A5%E5%88%B0%E6%95%B0%E6%8D%AE%E5%BA%93%E3%80%82%E9%81%87%E5%88%B0%E9%97%AE%E9%A2%98%EF%BC%8C%E6%89%A7%E8%A1%8C%E6%97%B6%E9%97%B4%E6%AF%94%E8%BE%83%E9%95%BF

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值