一:概述
业务场景: 执行一次巡检任务,在巡检任务执行前,任务表状态更新为执行中,异步线程执行巡检任务(巡检任务执行加了事务控制),在本次巡检任务执行完毕后,任务表更新为空闲状态。
遇到的问题:更新任务表为执行中可以放在控制器层,不受事务影响,但是更新任务表为空闲状态放在finally中会因为事务的回滚导致更新失败。
解决方法:finally中通过开启新事务
二:业务实现流程
业务层通过两个有事务注解的方法实现,如下图:
1.业务巡检执行,控制器层更新任务表状态,并使用异步线程执行任务。
2.任务执行方法加事务注解,实现事务控制,在finally中更新任务表状态。
需要注意的是调用方法时需要使用上下文获取spring管理的对象来调用,不能直接在方法中调用,因为事务注解是通过aop实现的,通过对象调用可以触发代理类实现事务注解,方法直接调用不会生效。
// (开启新事物)更新业务巡检计划执行状态为:空闲
SpringUtils.getBean(this.getClass()).updateBusinessPatrolExecuteState(ywglBusinessPatrol);
其中SpringUtils为封装的获取spring管理的bean的方法
3.在新的事务中更新任务表状态。
需要注意的是:事务的传播属性需要修改为propagation = Propagation.REQUIRES_NEW
因为默认的事务传播属性REQUIRED会加入上面的事务导致未开启新事务。
事务的详解可以参考一下链接
https://blog.csdn.net/weixin_41765715/article/details/129832448