【spring boot 事务方法的finally中开启新事务实现业务需求】

一:概述

业务场景: 执行一次巡检任务,在巡检任务执行前,任务表状态更新为执行中,异步线程执行巡检任务(巡检任务执行加了事务控制),在本次巡检任务执行完毕后,任务表更新为空闲状态。

遇到的问题:更新任务表为执行中可以放在控制器层,不受事务影响,但是更新任务表为空闲状态放在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

       

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值