用Java轻松完成一个分布式事务TCC,保姆级教程

本文介绍了如何使用Java实现TCC(两阶段提交)分布式事务模型,涉及TransInTry、TransInConfirm、TransInCancel等方法,以及在遇到事务失败时的回滚机制。还提到了如何部署和运行DTM实例以及处理Confirm/Cancel失败的情况。
摘要由CSDN通过智能技术生成

result.put(“dtm_result”, “SUCCESS”);

return result;

}

@RequestMapping(“TransInTry”)

public Map<String, String> TransInTry() {

logger.info(“TransInTry”);

Map<String, String> result = new HashMap<>();

result.put(“dtm_result”, “SUCCESS”);

return result;

}

@RequestMapping(“TransInConfirm”)

public Map<String, String> TransInConfirm() {

logger.info(“TransInConfirm”);

Map<String, String> result = new HashMap<>();

result.put(“dtm_result”, “SUCCESS”);

return result;

}

@RequestMapping(“TransInCancel”)

public Map<String, String> TransInCancel() {

logger.info(“TransInCancel”);

Map<String, String> result = new HashMap<>();

result.put(“dtm_result”, “SUCCESS”);

return result;

}

到此各个子事务的处理函数已经OK了,然后是开启TCC事务,进行分支调用

@RequestMapping(“fireTcc”)

public String fireTcc() {

Function<Tcc, Boolean> function = TccController::tccTrans;

return tcc.tccGlobalTransaction(function);

}

public static Boolean tccTrans(Tcc tcc) {

try {

boolean a = tcc.callBranch(“”, svc + “/TransOutTry”, svc + “/TransOutConfirm”, svc + “/TransOutCancel”);

boolean b = tcc.callBranch(“”, svc + “/TransInTry”, svc + “/TransInConfirm”, svc + “/TransInCancel”);

return a && b;

} catch (Exception e) {

e.printStackTrace();

}

return false;

}

至此,一个完整的TCC分布式事务编写完成。

如果您想要完整运行一个成功的示例,那么参考这个例子yedf/dtmcli-java-sample,将它运行起来非常简单

部署启动dtm

需要docker版本18以上

git clone https://github.com/yedf/dtm

cd dtm

docker-compose up

另起一个命令行

git clone https://github.com/yedf/dtmcli-java-sample.git

cd dtmcli-java-sample

编译运行例子 main/src/main/java/com/github/viticis/dtmclijavaexamples/DtmcliJavaSampleApplication

TCC的回滚


假如银行将金额准备转入用户2时,发现用户2的账户异常,返回失败,会怎么样?我们可以让TransIn返回失败来模拟这种情况

@RequestMapping(“TransInTry”)

public Map<String, String> TransInTry() {

logger.info(“TransInTry”);

Map<String, String> result = new HashMap<>();

result.put(“dtm_result”, “FAILURE”);

return result;

}

我们给出事务失败交互的时序图

图片

这个跟成功的TCC差别就在于,当某个子事务返回失败后,后续就回滚全局事务,调用各个子事务的Cancel操作,保证全局事务全部回滚。

在TCC事务模式上,有不少的读者会问,如果Confirm/Cancel失败会怎么样?这是一个好问题,代表您正在深入思考TCC事务模式。第一种情况是临时失败,例如网络故障、应用或数据库宕机,这类错误进行重试,最后会返回成功;另一种情况为业务失败,按照TCC的协议,第一阶段锁定资源,保证足够的资源能够让Confirm/Cancel执行,也就是说,程序逻辑上,Confirm/Cancel是不允许返回业务失败的,如果出现业务失败,那么是bug,需要开发人员手动修复bug。

小结

最后

做任何事情都要用心,要非常关注细节。看起来不起眼的、繁琐的工作做透了会有意想不到的价值。
当然要想成为一个技术大牛也需要一定的思想格局,思想决定未来你要往哪个方向去走, 建议多看一些人生规划方面的书籍,多学习名人的思想格局,未来你的路会走的更远。

更多的技术点思维导图我已经做了一个整理,涵盖了当下互联网最流行99%的技术点,在这里我将这份导图分享出来,以及为金九银十准备的一整套面试体系,上到集合,下到分布式微服务

套面试体系,上到集合,下到分布式微服务**

[外链图片转存中…(img-2fGucoyV-1714761625292)]

[外链图片转存中…(img-zyAr5sdj-1714761625293)]

[外链图片转存中…(img-EC0fI0k0-1714761625294)]

[外链图片转存中…(img-xWIcLmd7-1714761625294)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 25
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值