应用管理与运维平台 ServiceStage应用管理与运维平台 ServiceStage

更新时间:2021/09/03 GMT+08:00
分享

定义全局事务和分支事务

在需要保证事务一致性的方法上使用注解:

@DTMTxBegin(appName = "xx")

其中,appName是全局事务的唯一标识。同时在在分支事务的try方法上使用注解:

@DTMTccBranch(identifier = "xx", confirmMethod = "xx", cancelMethod = "xx")

confirm方法和cancel方法需要保证幂等性。

其中:

  • identifier是分支事务的唯一标识。
  • confirmMethod对应着无异常情况下执行的confirm方法。
  • cancelMethod对应着发生异常情况下执行的cancel方法。

当全局事务提交时,DTM通知分支事务执行confirm方法。

当全局事务回滚时,DTM通知分支事务执行cancel方法。

DTM全局事务发起者定义为transferTcc方法,该方法通过微服务接口调用bankA转入的try方法和bankB转出的try方法,同时根据设置选择性抛出异常。

// com.huawei.bankcenter.controller.BankCenterController.java
@GetMapping(value = "transferTcc")
@DTMTxBegin(appName = "tcc-transfer-SpringCloud")
public String transferTcc(@RequestParam(value = "id") int id, @RequestParam(value = "money") int money,
    @RequestParam(value = "exception") boolean exception) {
    LOGGER.info("Bank-center start invoke bankA and bankB by tcc_mode");
    bankOperator.transferTcc(id, money);
    if (exception) {
        throw new RuntimeException("Add a potential exception");
    }
    return "ok";
}
// bankOperator 有两个实现类,下面以 FeignOpImpl 的实现类为例
// com.huawei.bankcenter.impl.FeignOpImpl.java
public String transferTcc(int userId, int money) {
    LOGGER.info("Start tcc---feign");
    bankAIntf.transferTcc(userId, money);
    bankBIntf.transferTcc(userId, money);
    return "ok";
}

分支事务定义为tryTransferIn方法,全局事务中发生异常则执行cancel方法,没有发生异常则执行confirm方法。

// com.huawei.banka.controller.BankAController.java 
@GetMapping(value = "transferTcc")
@DTMTccBranch(identifier = "tcc-try-transfer-in", confirmMethod = "confirm", cancelMethod = "cancel")
public void tryTransferIn(@RequestParam(value = "id") int id, @RequestParam(value = "money") int money) {
    bankAService.tryTransferIn(id, money);
}
public void confirm() {
    bankAService.confirm();
}
public void cancel() {
    bankAService.cancel();
}
// com.huawei.common.impl.BankBController.java
@GetMapping(value = "transferTcc")
@DTMTccBranch(identifier = "tcc-try-transfer-out", confirmMethod = "confirm", cancelMethod = "cancel")
public void tryTransferOut(@RequestParam(value = "id") int id, @RequestParam(value = "money") int money) {
    bankBService.tryTransferOut(id, money);
}
public void confirm() {
    bankBService.confirm();
}
public void cancel() {
    bankBService.cancel();
}
分享:

    相关文档

    相关产品