应用管理与运维平台 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全局事务发起者定义为transferTccLocal方法,transferTccLocal方法调用bankA转入服务和bankB转出服务,同时根据设置选择性抛出异常。

// com.huawei.dtm.client.service:TransferService.java  
@DTMTxBegin(appName = "transfer-tcc-local")
public void transferTccLocal(int id, int money, boolean exception) {
    bankAService.tryTransfer(id, money);
    bankBService.tryTransfer(id, money);
    if (exception) {
        throw new RuntimeException("Add a potential exception");
    }
}

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

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

    相关文档

    相关产品