seata 手动回滚之后还会去触发commitTransaction方法?

yacmzcpb  于 4个月前  发布在  其他
关注(0)|答案(4)|浏览(68)

回滚是正常的,但是最后return返回信息的时候触发了TransactionalTemplate的commitTransaction方法,由于手动回滚了,所以是Finished状态。但他的进程并不会终止?
`​
@OverRide
@GlobalTransactional(name = "global-create-order", rollbackFor = Exception.class)
public ResultData createOrder(Order order) {
Integer result = orderMapper.insert(order);

if (result > 0) {
  ResultData stoResultData = storageApi.decrease(order.getProductId(), order.getCount());
  ResultData accResultData = accountFeign.decrease(order.getUserId(), order.getMoney());

  // 全局事务未如期完成,手动回滚,并返回自定义错误信息
  if (!Objects.equals(accResultData.getCode(), "200") || !Objects.equals(
      stoResultData.getCode(), "200")) {
    log.error("stoResultData:{}",stoResultData.getMessage());
    log.error("accResultData:{}",accResultData.getMessage());

    try {
      
      // 在这里手动回滚
      GlobalTransactionContext.reload(RootContext.getXID()).rollback();
    } catch (TransactionException e) {
      throw new RuntimeException(e);
    }
  } else {
    order.setStatus(1);
    orderMapper.updateById(order);
    return ResultData.success(order);
  }
}

// 返回自定义信息
return ResultData.fail(ReturnCodeEnum.RC999.getCode(), ReturnCodeEnum.RC999.getMessage());

}

​`

vawmfj5a

vawmfj5a1#

请问你使用的什么版本?
What version are you using?

jljoyd4f

jljoyd4f2#

我想了解下,为什么有注解的方式,还依然要用api加以配合呢?
I would like to understand, why do we still use APIs in conjunction with annotations?

pu3pd22g

pu3pd22g3#

我想了解下,为什么有注解的方式,还依然要用api加以配合呢? I would like to understand, why do we still use APIs in conjunction with annotations?

你好,我用的是2.0.0版本
我想的是如果后续的代码还需要执行的话,就使用了手动回滚,但是在手动回滚之后,注解所触发的事务进程并没有被终止,导致最后return的时候还会去提交,触发了 Global transaction[%s] not found, may be rollbacked. ,所以感觉很奇怪

2wnc66cl

2wnc66cl4#

我想了解下,为什么有注解的方式,还依然要用api加以配合呢? I would like to understand, why do we still use APIs in conjunction with annotations?

你好,我用的是2.0.0版本 我想的是如果后续的代码还需要执行的话,就使用了手动回滚,但是在手动回滚之后,注解所触发的事务进程并没有被终止,导致最后return的时候还会去提交,触发了 Global transaction[%s] not found, may be rollbacked. ,所以感觉很奇怪

社区目前的考虑是,api就专注于使用api方式管理事务,而注解方式就代表你的事务将被框架托管,理论上不应该再使用api去介入.所以我们需要一个比较明确的理由,让我们认定这是一个bug或者需求
The current consideration of the community is that the API focuses on using the API to manage transactions, and the annotation method means that your transactions will be hosted by the framework, and theoretically you should no longer use the API to intervene. So we need a clear reason to determine that this is a bug or a requirement

相关问题