情景:一个定时任务,每天凌晨同步某一张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 ,定时同步任务实现了
其他