使异步调用方法的事务@Transactional生效

有这个业务场景,入库A表后异步更新B表数据,B表异常,A和B事务回滚。

之前是在方法一直接异步调用方法二,发现下面的事务不生效,有异常不会回滚,根据这篇文章找到了原因

https://mp.weixin.qq.com/s/fx1tDzezuE3NWqGpIOU7og

改了改调用方式,把方法二暴露在service层,通过注入调用,这样确实把事务控制住了。

但还是有个问题,如果调用方法二后方法一出现了异常,方法一可以回滚,方法二没法回滚,因为方法一和二是两个不同的事务,想一同回滚还是改成同步调用吧。

  @Autowired
    private MyUserService myUserService;
@Transactional(rollbackFor = Exception.class)// 方法一
    public void insert() {
        // 入库逻辑省
        try {
            CompletableFuture<ZpUserBusiness> future = supplyAsync(() -> myUserService.testTran(save));
            future.get();
        } catch (Exception e) {
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
    @Transactional // 方法二
    public ZpUserBusiness testTran(User user) {
        // 入库逻辑省
        int a[] = {1};
        System.out.println(a[2]);
        return save;
    }
最后修改:2020 年 09 月 26 日 12 : 28 PM