子线程抛出异常回滚子线程以及子线程所在父线程

    @Resource
    private TransactionTemplate transactionTemplate;

    /**
     * @description
     * @author chenchen
     * @date 2023/5/18 17:54
     * @param supportMilesightUplinkDataBo
     * @return boolean
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean uplinkData(SupportMilesightUplinkDataBo supportMilesightUplinkDataBo) {
        System.out.println(supportMilesightUplinkDataBo);

        //主线程更新数据,声明式事务控制父线程回滚
        SupportRfidSubTask supportRfidSubTask = new SupportRfidSubTask();
        supportRfidSubTask.setId(911L);
        supportRfidSubTask.setNumberUnit("999");
        supportRfidSubTaskService.updateById(supportRfidSubTask);

        //子线程更新数据,编程式事务控制子线程回滚
        FutureTask<Boolean> futureTask = new FutureTask<>(() -> transactionTemplate.execute(new TransactionCallback<Boolean>() {
            /**
             * @param status 事务运行状态信息 是否是新事务、是否已被标记为回滚等
             * @return
             */
            @Override
            public Boolean doInTransaction(@NotNull TransactionStatus status) {
                try {
                    SupportRfidSubTask supportRfidSubTask2 = new SupportRfidSubTask();
                    supportRfidSubTask2.setId(912L);
                    supportRfidSubTask2.setNumberUnit("888");
                    supportRfidSubTaskService.updateById(supportRfidSubTask2);
                    throw new RuntimeException("子线程执行失败了");
                    //return true;
                } catch (Exception exception) {
                    System.out.println("执行事务异常,需要回滚");
                    //触发子线程事务回滚
                    status.setRollbackOnly();
                    throw new RuntimeException(exception.getMessage());
                }
            }
        }));
        new Thread(futureTask).start();

        Boolean result;
        try {
            //获取子线程的结果,子线程抛出异常直接捕获
            result = futureTask.get();
        } catch (Exception e) {
            //抛出异常触发父线程事务回滚
            throw new RuntimeException(e.getCause().getMessage());
        }
        return result;
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值